【发布时间】:2015-08-18 12:21:32
【问题描述】:
我有一个广泛的工作簿,它存在于多个版本中,其中包含数百个命名范围。
我想编写一个宏,将输入到某些命名范围的用户输入数据从本书的一个实例传输到另一个实例。
书中的命名范围遵循一定的约定,为了这个宏的目的,我想复制以"in_*"和"resetRange_*"开头的所有命名范围的值(它们是常量)
宏应该:
- 打开源书(与当前书定义的命名范围大多相同)
- 遍历源书的所有命名范围并找到
like "in_*" or "resetRange_*" - 将命名范围内的值从源书复制到当前书(即使名称指的是区域)
我的主要问题是:
- 如何正确复制?当前的实现不起作用
- 有没有更好的方法来测试当前书中是否仍然存在源名称?
有问题的命名范围都以工作簿为范围。
宏运行无错误但不粘贴任何值的问题。当前书的命名范围保持为空,而源书包含数据 '
Public Sub TransferInputDataFromOtherTool()
Dim sourceBook As Workbook
Dim bookPath As Variant
'get source book
bookPath = Application.GetOpenFilename("(*.xlsm), *.xlsm", Title:="Select source tool:")
If VarType(bookPath) = vbString Then
Set sourceBook = Workbooks.Open(bookPath)
End If
On Error GoTo Cleanup
'@TODO transfer ranges _
resetRange_* _
in_*
'retrieving data
For Each n In sourceBook.Names
On Error Resume Next
rangeName = n.Name
boola = ThisWorkbook.Names(n.Name)
If boola Then
On Error GoTo 0
If rangeName Like "in_*" _
or rangeName like "resetRange_*" Then
'check for allow edit
On Error Resume Next
sourceBook.Activate
source_value = n.refersToRange.Value
ThisWorkbook.Activate
Range(rangeName).Value = source_value
'Debug.Print rangeName, source_value
'Debug.Print Err.Description, Err.source
On Error GoTo 0
End If
' deleting all in_-values
End If
Next n
'@TODO transfer tables
'ExcelHandling.EnableInteractivity
Cleanup:
On Error Resume Next
sourceBook.Close
On Error GoTo 0
End Sub
【问题讨论】:
-
那么失败或问题在哪里?
-
您是否正确地遍历了所有名称?如果您在检查条件之前 debug.print 命名范围,您是否正确获得了所有这些范围?您可能需要根据范围的声明方式来定义范围 [Sheet1.Range("thisrange")] 的工作表。
-
出于某种原因,
source_value = Range(rangeName).Value始终为空。我用= n.refersToRange.Value替换了它,这似乎可以工作(除了具有多个区域的断开范围之外) -
您想在新工作簿中创建/定义名称吗?还是您只是想提取数据?
-
两本书中都存在名字,我只想将一本书的值复制到第二本书的相应范围