Excel VBA 从工作表中的公式创建命名范围
Excel VBA create a Named range from formula in worksheet
你好,我的一些 VBA 代码有问题。
我正在制作一个多动态 table 来帮助我保持对程序的控制。
因此,当我在 table 中调整某些内容时,我可以使用此代码来更新我的所有代码。
在 table 中,我使用此代码来定位我需要的数据,到目前为止效果很好。
Source_1_Criteria = "Factuur"
Source_1 = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 1).Value
Me.ListBox1.RowSource = Source_1
现在我想使用相同的代码并添加一些额外的代码来创建一个命名范围。
这在我使用仅包含一些文本的单元格时有效,但是当我用公式 VBA 填充单元格时会引发错误。
Source_1_Criteria = "Factuur"
Source_1_Name = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 2).Value
Source_1_Area = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 4).Value
ActiveWorkbook.Names.Add Name:=Source_1_Name, RefersTo:=Source_1_Area
范围Source_1_Area的内容是
=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))
当我在内容中放置 =archief!$A$2 时,我使用的代码确实有效
为什么我的大公式不起作用?
这将使用您在命名范围内提供的公式
Sub Test()
AllocateNamedRange ThisWorkbook, "SomeName", "=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))", "A1"
'English version:
'AllocateNamedRange ThisWorkbook, "SomeName", "=OFFSET(archief!$A,0,0,1,COUNTA(archief!$A:$Y))", "A1"
End Sub
Sub Test2()
'Using some of your code to find the name.
Dim rFoundRange As Range
With ThisWorkbook.Worksheets("Sheet1").Range("MDM_MDM_Tool_List")
Set rFoundRange = .Find(what:=Source_1_Criteria)
'If Source_1_Criteria isn't found it will throw an error so need to check if it's found first.
If Not rFoundRange Is Nothing Then
AllocateNamedRange ThisWorkbook, rFoundRange.Offset(0, 2).Value, _
"=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))", "A1"
End If
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : AllocateNamedRange
' Purpose : Deletes the named range if it already exists and then recreates it.
'---------------------------------------------------------------------------------------
Public Sub AllocateNamedRange(Book As Workbook, sName As String, sRefersTo As String, Optional ReferType = "R1C1")
With Book
If NamedRangeExists(Book, sName) Then .Names(sName).Delete
If ReferType = "R1C1" Then
.Names.Add Name:=sName, RefersToR1C1:=sRefersTo
ElseIf ReferType = "A1" Then
.Names.Add Name:=sName, RefersTo:=sRefersTo
End If
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : NamedRangeExists
' Purpose : Checks if a named range exists. Returns TRUE or FALSE.
'---------------------------------------------------------------------------------------
Public Function NamedRangeExists(Book As Workbook, sName As String) As Boolean
On Error Resume Next
NamedRangeExists = Book.Names(sName).Index <> (Err.Number = 0)
On Error GoTo 0
End Function
您可以将公式硬编码到命名范围内,它会在您添加新数据时自动调整(基本上是我的代码所做的)。
你好,我的一些 VBA 代码有问题。
我正在制作一个多动态 table 来帮助我保持对程序的控制。 因此,当我在 table 中调整某些内容时,我可以使用此代码来更新我的所有代码。
在 table 中,我使用此代码来定位我需要的数据,到目前为止效果很好。
Source_1_Criteria = "Factuur"
Source_1 = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 1).Value
Me.ListBox1.RowSource = Source_1
现在我想使用相同的代码并添加一些额外的代码来创建一个命名范围。 这在我使用仅包含一些文本的单元格时有效,但是当我用公式 VBA 填充单元格时会引发错误。
Source_1_Criteria = "Factuur"
Source_1_Name = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 2).Value
Source_1_Area = Range("MDM_MDM_Tool_List").Find(what:=Source_1_Criteria).Offset(0, 4).Value
ActiveWorkbook.Names.Add Name:=Source_1_Name, RefersTo:=Source_1_Area
范围Source_1_Area的内容是
=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))
当我在内容中放置 =archief!$A$2 时,我使用的代码确实有效
为什么我的大公式不起作用?
这将使用您在命名范围内提供的公式
Sub Test()
AllocateNamedRange ThisWorkbook, "SomeName", "=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))", "A1"
'English version:
'AllocateNamedRange ThisWorkbook, "SomeName", "=OFFSET(archief!$A,0,0,1,COUNTA(archief!$A:$Y))", "A1"
End Sub
Sub Test2()
'Using some of your code to find the name.
Dim rFoundRange As Range
With ThisWorkbook.Worksheets("Sheet1").Range("MDM_MDM_Tool_List")
Set rFoundRange = .Find(what:=Source_1_Criteria)
'If Source_1_Criteria isn't found it will throw an error so need to check if it's found first.
If Not rFoundRange Is Nothing Then
AllocateNamedRange ThisWorkbook, rFoundRange.Offset(0, 2).Value, _
"=VERSCHUIVING(archief!$A;0;0;1;AANTALARG(archief!$A:$Y))", "A1"
End If
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : AllocateNamedRange
' Purpose : Deletes the named range if it already exists and then recreates it.
'---------------------------------------------------------------------------------------
Public Sub AllocateNamedRange(Book As Workbook, sName As String, sRefersTo As String, Optional ReferType = "R1C1")
With Book
If NamedRangeExists(Book, sName) Then .Names(sName).Delete
If ReferType = "R1C1" Then
.Names.Add Name:=sName, RefersToR1C1:=sRefersTo
ElseIf ReferType = "A1" Then
.Names.Add Name:=sName, RefersTo:=sRefersTo
End If
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : NamedRangeExists
' Purpose : Checks if a named range exists. Returns TRUE or FALSE.
'---------------------------------------------------------------------------------------
Public Function NamedRangeExists(Book As Workbook, sName As String) As Boolean
On Error Resume Next
NamedRangeExists = Book.Names(sName).Index <> (Err.Number = 0)
On Error GoTo 0
End Function
您可以将公式硬编码到命名范围内,它会在您添加新数据时自动调整(基本上是我的代码所做的)。