在VBA中更新ActiveWorkbook.Names(“X”)。RefersTo和Names.Value

我有一些代码,目前通过工作表查找任何单元格,我用浅灰色填充,然后将该单元格中的值添加到名称列表。 目标是在工作簿中的其他地方,我可以将这个列表作为下拉列表引用。

这是我现在的代码:

Sub Add_Food_To_List() i = 1 Application.ScreenUpdating = False Range("a1:a60").Select x = "{" y = "" first = True For Each Cell In Selection If ActiveCell.Interior.ColorIndex = "2" Then i = i + 1 If first = False Then x = x & ", " & ActiveCell.Value y = y & ", " & ActiveCell.Address End If If first Then x = x & ActiveCell.Value y = y & ActiveCell.Address first = False End If ActiveWorkbook.Names("Foods").RefersTo = y ActiveWorkbook.Names("Foods").Value = x End If ActiveCell.Offset(1, 0).Select Next Cell Range("a1").Select Application.ScreenUpdating = True End Sub 

由于某些原因,在For Each Cell In Selection这两行:

  ActiveWorkbook.Names("Foods").RefersTo = y ActiveWorkbook.Names("Foods").Value = x 

相互覆盖。 无论哪一个最后都会以名称中指定的“值”和“值”结束。

奖金:这是我第一个VBA脚本。 我怎样才能让这个脚本在整个工作簿上运行,而不仅仅是活动工作表? 另外,如何使它在保存或工作簿更新时自动运行?

也许这会更好地为您服务:

  1. 使用名称Reference在工作簿中创build一个工作表。
  2. 在细胞A1中inputFoods ,并在细胞A2中放入至less一种随机食物。
  3. 用下面的公式创build一个定义的Foods名称: =offset(A2,0,0,counta(A:A)-1,1)这是一个dynamic命名范围 ,当行被添加或删除时将扩展或收缩确保数据之间没有空行)。
  4. 将下面的代码放在VBE的ThisWorkbook模块中。 下面的代码将在Workbook保存之前运行。 它将循环遍历每个工作表,并将Range(A1:A60)突出显示为灰色的任何单元格的值添加到现有行集合正下方Reference工作表的A列中的行集。

代码模块:

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.ScreenUpdating = False Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets If ws.Name <> "Reference" Then With ws Dim rCell As Range For Each rCell In .Range("a1:a60") If rCell.Interior.ColorIndex = "2" Then Dim wsRef As Worksheet Set wsRef = Sheets("Reference") If wsRef.Range("Foods").Find(rCell.Value, lookat:=xlWhole) Is Nothing Then wsRef.Range("A" & wsRef.Rows.Count).End(xlUp).Offset(1).Value = rCell.Value2 End If End If Next End With End If Application.ScreenUpdating = True End Sub