如何在Excel中使用单元格存储额外的(隐藏)信息

时间:2012-07-05 22:03:21

标签: excel vba excel-vba ms-office

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

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

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

研究说我可以使用评论(虽然我不确定我是否可以从vba访问这些,我希望它们被隐藏)或隐藏的工作表来镜像我使用的每个工作表和给定的信息该工作表上的单元格。我可能会选择后者,但它并不完美。

还有其他想法吗?

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

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

6 个答案:

答案 0 :(得分:9)

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

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

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

只要在值上加0就会受到影响,效果很好。

答案 1 :(得分:4)

过去我需要为应用程序存储数据但用户无法访问的内容是使用可见性设置为VeryHidden的工作表。

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

答案 2 :(得分:1)

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

以乔纳斯·格莱森 (Jonas Glesaaen) 的风格:

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

答案 3 :(得分:0)

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

您可以使用:

=“显示价值”&amp; left(“这是计算......”,0)

OR:

= CHOOSE(1,“显示值”,“这是计算......”)

答案 4 :(得分:0)

每个电子表格都应包含标签或标题,或至少包含一些说明字段。如果这是真的,有一个技巧,你可以隐藏其中一个单元格中的值,没有人会发现。这是你如何做到的。

  1. 使用=N()在单元格中输入值。例如:
  2. =N("Apple, Google, Facebook, Microsoft")

    1. 转到Format Cells > Custom:输入要为标题/标签/说明显示的文字。例如:
    2. "Header Name"

      正如您可以看到附加图像,我能够在单元格中输入文本但显示不同的内容。作为奖励,您可以使用以下语法从您的程序的VBA返回公式/文本:

      Range("A1").Formula

      希望这有帮助。

      enter image description here

答案 5 :(得分:0)

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

将数据保存到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 GUI编辑超链接,并且单击它不会触发FollowHyperlink事件,因此它会破坏excel。如果您只是将?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