0

我有一个非常特殊的问题。我寻找与我类似的问题,测试了很多人提出的解决方案,但没有一个是我需要的。

我的客户需要以 excel 格式导出数据表。这些数据可以进行排序、修改、重新排列,可以输入新值,有些行可能会消失,有些行可以取而代之,总之,这些数据可能发生任何事情。例如,假设我们导出杂货清单中显示的项目列表。

ItemID ItemName Price
Fr01   Apple    2.5
Fr02   Orange   4.0
Mt01   Beef     10.0
Mt02   Pork     8.33
Vg01   Carrot   1.25

我的问题是,这些数据可以重新导入到最初创建 excel 的软件中,以根据“ItemID”在数据库中更新(或添加)这些值。如果数据在值、类型和相互关系方面“正确”,我已经进行了验证。

我试图给范围命名。问题是当数据被过滤/排序时,名称不跟随内容,它静止在同一位置

original :(范围名称是范围的名称,而不是实际的列)

ItemID ItemName Price || Range Name
Fr01   Apple    2.5   || data_fr01
Fr02   Orange   4.0   || data_fr02
Mt01   Beef     10.0  || data_mt01
Mt02   Pork     8.33  || data_tm02
Vg01   Carrot   1.25  || data_vg01

对 ItemName 排序后:

ItemID ItemName Price || Range Name
Fr01   Apple    2.5   || data_fr01
Mt01   Beef     10.0  || data_fr02
Vg01   Carrot   1.25  || data_mt01
Mt02   Pork     8.33  || data_tm02
Fr02   Orange   4.0   || data_vg01

正如您所看到的,所有信息都正确跟随,除了范围名称,所以,当我尝试导入时,我得到了很多数据不匹配。

我的另一个尝试是使 NameRange 成为 excel 中的实际单元格。使用这种方法,单元格跟随,但可以更改,所以我尝试创建一个受保护的单元格。遗憾的是,因此无法插入或删除行。我找到了一种解决方法,即在蒙版表中包含名称,但我需要再次同步表,由于前面提到的相同原因,这是不可靠的。

更糟糕的是,我必须同时支持 xls (97-2003) 和 xlsx。

所以我正在寻找一种稳定的解决方法,它允许我以某种方式将我的“范围名称”数据存储在单元格中,使其对 Excel 用户不可见,但会跟随数据,以便我可以在重新时在正确的位置检索它- 导入数据。

提前致谢。

编辑 :

在结局中,我必须能够从 C# 应用程序中编写此属性,然后用 C# 读回相同的属性,并且它必须与 excel 文件格式兼容,excel 用户无法查看或编辑,但要保持其原始值集,无论如何发生在工作表中的数据除了删除(我不介意我只是把它放在我写 Apple 的单元格上,而不是整个范围)

4

4 回答 4

1

好的(我仍然认为在导出但 YMMV 时向工作表添加验证智能更好)。

尝试使用 Range.ID 字符串属性 - 它在 Excel UI 中不可编辑或可见,并且随单元格移动。如果单元格被删除,它就会消失。如果单元格被复制,则 ID 属性将被复制,因此会有重复。
它是在 Excel 2000 中引入的,因此可能不适用于 Excel 97,但在 Excel 2000 到 Excel 2013 的所有文件格式中都应该没问题。
这是一些示例 VBA 代码:

Sub putids()
    Dim j As Long
    For j = 1 To 5
        Range("a1").Offset(j - 1, 0).ID = CStr(j)
    Next j
End Sub

Sub getids()
    Dim j As Long
    For j = 1 To 5
        Debug.Print Range("a1").Offset(j - 1, 0).ID
    Next j
End Sub
于 2013-05-11T16:32:30.377 回答
0

使用每个人的一些建议并将它们合并。

由于任何简单且正常的解决方案在我们的上下文中都不可行,并且由于我们可以尝试将某些内容放入(ID)中的唯一可能属性不是持久的,而且考虑到事实,我们需要客户端不要意外破坏该值任何事情都可能发生并且将会发生,因为没有太多限制,而且我们无法在不禁用行操作的情况下锁定工作表的一部分,因为存在锁定单元格的副作用,这是我们能够做到的最接近的事情实现的方法是将我们的键作为格式化字符串插入 A 列中,并使用一个看起来很奇怪的公式允许我们隐藏显示,然后我们隐藏该列,使其无法被用户意外访问。

=IF(FALSE,"our formatted string","")

由于这个隐藏的列有数据,它在排序时跟随它的行并且尝试复制整行是不可能的,因为我们只从 B 列中选择(这导致尝试在 255 个单元格中插入 256 个值)我们可以控制一点“假重复”,即使没有完全消除。

在进口商方面,我们只是读回了一个小技巧,将公式与值进行比较(因为值是空的,只有公式得到我们的格式化数据)并使用一些正则表达式来检索格式化字符串的含义,然后进行所有验证在实际的数据库导入之前。

其余的,它将转到用户的训练部分,不要“删除”A列中的数据,而不是搜索它。

再次感谢大家。

于 2013-05-13T19:34:38.083 回答
0

我看不出命名范围如何帮助你。
有没有想过使用 before save 事件给工作簿添加验证码,让用户无法保存无效的数据?

或者看看您可以使用 Excel 的数据验证规则做多少事情。

否则您必须读取所有数据并稍后在数据库更新时对其进行验证(这基本上为时已晚)
大概基本验证是 iTemID 是有效的 - 您的数据库代码不会关心数据的顺序,并且可以跳过空行等。

于 2013-05-10T19:01:43.283 回答
0

我认为您应该使用一些关键列,无论是您组成的唯一名称,还是构成数据行的记录的串联。任何。将其设为最左侧的列,隐藏并锁定它,用户无法显示该列或更改其内容。

然后在另一个工作表中,取相同的值并从 A2 开始粘贴它们。

现在在 B2 输入这个公式

=VLOOKUP(<this row's key value>,<Your data array in sheet1>,<column number>,FALSE)

这是一个如何进行固定列/行设置的示例

=VLOOKUP($A2,BigNamedRange,B$1,FALSE)

现在隐藏该表。

现在您在第一张表中拥有的是用户可以过滤/排序/执行任何操作的区域,在您的第二张受控表中,您可以按照想要查看的顺序获得数据(可以独立于用户的床单)。

编辑:

单击 1:Allow Users TO Edit Ranges并设置您要让用户编辑的范围。然后,2:,单击Protect Sheet/ Protect Workbook(您需要的)以锁定其他所有内容。

现在您的用户可以编辑您允许他们的内容,而不是编辑其他所有内容 在此处输入图像描述

于 2013-05-10T18:10:22.583 回答