6

我正在编写一个工作应用程序,它将一大堆不同的电子表格编译成特定工作站点的报告。我有很多工作表,每个工作表都有一大堆指标。每张工作表上的每个指标可能需要从不同的工作表编译,并且可以通过查找关键字在该工作表上找到。

另一个问题是这些电子表格上的一些措辞会定期更改以更好地反映行业标准,因此我不能只硬连线关键字来搜索。

因此,我正在寻找一种方法来存储元数据以及可以对用户隐藏的单元格,这样他们就不会意外删除它,但可以从 VBA 轻松访问,以便在需要时进行更改(我会编写一个程序来执行此操作如果需要的话)。

研究表明我可以使用注释(尽管我不确定我是否可以从 vba 访问这些,并且我希望它们被隐藏)或隐藏的工作表来反映我使用的每个工作表以及给定单元格中的信息工作表。我可能会选择后者,但这并不完美。

还有其他想法吗?

为清楚起见进行编辑:我需要一个与单个单元格关联的字符串,它将指出如何找到适当的数据。例如:“查看工作簿 1 -%- 搜索此文本”。

@Andrew 提到的 VeryHidden 属性可能是最好的方法,因为我认为没有办法将变量附加到单元格。

4

6 回答 6

10

我最喜欢的技巧之一是使用该N()功能。

N()将非数字转换为数字,但如果您输入文本,它始终返回 0。当我需要为自己添加单元格注释时,我将添加如下内容:

=..... +N("This is to calculate blah blah blah")

只要将 0 添加到该值不会受到伤害,它就可以很好地工作。

于 2012-07-06T00:43:33.220 回答
4

我过去在需要为应用程序存储数据但用户不应访问的数据时所做的是使用可见性设置为VeryHidden.

还可以选择创建一个 Excel 加载项 (XLA),它可以独立于用户数据,因此可以在需要更改规则时单独更新 - 尽管可以在“更新”工作簿中使用 VBA 来替换“数据”工作簿中的整个 VBA 模块。我将不得不看看我是否能找到我为此编写的代码。

于 2012-07-05T22:58:47.380 回答
2

您可以对 Text 使用类似的技巧。

您可以使用:

="Display Value" & left("This is to calculate...",0)

或者:

=CHOOSE(1,"Display Value","This is to calculate...")
于 2017-07-24T06:00:06.237 回答
1

这是一个非常有趣的问题。感谢科洛菲!那么使用单元格的 ID 呢?

以乔纳斯·格莱桑的风格:

Public Sub WriteHiddenData(ByVal Cell As Range, ByVal Data As String)

    Cell.ID = """@" & Data & """"

End Sub

Public Function ReadHiddenData(ByVal Cell As Range) As String

    Dim Data As String
    Data = Cell.ID

    ' Check that the data is on your specific format
    Dim L%
    L = Len(Data)
    If L < 3 Then Exit Function
    If Left$(Data, 2) <> """@" Then Exit Function
    If Right$(Data, 1) <> """" Then Exit Function

    ReadHiddenData = Mid$(Data, 3, L - 3)

End Function
于 2021-07-03T06:10:48.157 回答
1

我遇到了这个确切的问题,并根据需要找到了几个可能的解决方案。

将数据保存在Hyperlink

您可以将数据存储在超链接中,例如链接本身或链接的工具提示中。这种方法的优点是数据与单元本身相关联,而不是与地址相关联。这意味着如果有人对单元格进行排序,则隐藏数据会随之而来。如果您愿意,您也可以捕获 HyperlinkClick 事件,但是这些超链接都没有到达任何地方,因此它可能无关紧要。

使用ScreenTip

' Write hidden data to a cell
Public Sub WriteData(ByVal Cell As Range, ByVal Data As String)

    Cell.Hyperlinks.Delete
    Cell.Hyperlinks.Add Cell, Address:="#", ScreenTip:=Data

    ' Set standard formatting
    With Cell.Font
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With

End Sub

' Read hidden data from a cell
Public Function ReadData(ByVal Cell As Range) As String

    If Not CellContainsData(Cell) Then Exit Function

    ReadData = Cell.Hyperlinks(1).ScreenTip

End Function

Private Function CellContainsData(ByVal Cell As Range) As Boolean

    CellContainsData = Cell.Hyperlinks.Count > 0

End Function

使用Address

这可能对您可以保存的字符串类型有一些限制,因为它们必须是有效的链接。例如,其中不能有任何空格,但您当然可以使用代码(如\20)来表示空格并稍后对其进行解码。

免责声明:我实际上并不完全确定这是做什么的,我试图找到一种方法来创建一个没有去任何地方的有效链接,这就是我想出的。它有点破坏 excel,因为您不能再使用 Excel GUI 编辑超链接,并且单击它不会触发FollowHyperlink事件。如果您只是设置?Data为地址,那么 Excel 将在下次有人单击它时将其清除。

' Write hidden data to a cell
Public Sub WriteData(ByVal Cell As Range, ByVal Data As String)

    Cell.Hyperlinks.Delete
    Cell.Hyperlinks.Add Cell, Address:="//?" & Data, ScreenTip:="Nothing suspicious here."

    ' Set standard formatting
    With Cell.Font
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With

End Sub

' Read hidden data from a cell
Public Function ReadData(ByVal Cell As Range) As String

    If Not CellContainsData(Cell) Then Exit Function

    Dim Data As String
    Data = Cell.Hyperlinks(1).Address    

    ReadData = Right$(Data, Len(Data) - 3)

End Function

Private Function CellContainsData(ByVal Cell As Range) As Boolean

    If Cell.Hyperlinks.Count < 1 Then Exit Function

    Dim Data As String
    Data = Cell.Hyperlinks(1).Address

    ' Check that the cell has the correct prefix
    If Len$(Data) < 3 Then Exit Function
    If Left$(Data, 3) <> "\\?" Then Exit Function

    CellContainsData = True

End Function

将数据保存在Validation

也可以在单元格的验证中存储数据。但是,如果有人对细胞进行分类,这将不起作用。

' Write hidden data to a cell
Public Sub WriteData(ByVal Cell As Range, ByVal Data As String)

    With Cell.Validation
        ' Remove previous validation
        .Delete

        ' Write data on a specific format so you know it was you.
        .Add xlValidateCustom, Formula1:="""@" & Data & """"

        ' Hide it as well as possible
        .InCellDropdown = False
        .ShowInput = False
        .ShowError = False
    End With

End Sub

' Read hidden data from a cell
Public Function ReadData(ByVal Cell As Range) As String

    If Not CellContainsData(Cell) Then Exit Function

    Dim Data As String
    Data = Cell.Validation.Formula1

    ReadData = Mid$(Data, 3, Len(Data) - 3)

End Function

Private Function CellContainsData(ByVal Cell As Range) As Boolean

    On Error GoTo InvalidValidation

    If Cell.Validation.Type <> xlValidateCustom Then Exit Function

    Dim Data As String
    Data = Cell.Validation.Formula1

    ' Check that the data is on your specific format
    If Left$(Data, 2) <> """@" Then Exit Function
    If Right$(Data, 1) <> """" Then Exit Function

    CellContainsData = True

InvalidValidation:
    Exit Function

End Function
于 2019-10-03T15:22:46.743 回答
0

每个电子表格都应该有标签或标题,或者至少有一些描述字段。如果这是真的,那么有一个技巧可以让您在其中一个单元格中隐藏一个值,而没有人会发现。这是你如何做到的。

  1. 用 输入单元格中的值=N()。例如:

=N("Apple, Google, Facebook, Microsoft").

  1. 转到Format Cells > Custom:输入要为标题/标签/描述显示的文本。例如:

"Header Name".

如您所见,我可以在单元格中输入文本,但显示的内容有所不同。作为奖励,您可以使用以下语法从 VBA 为您的程序获取公式/文本:

Range("A1").Formula

希望这可以帮助。

在此处输入图像描述

于 2017-08-31T17:38:42.547 回答