运行 VBA 加载项时出错
error while running VBA add-in
我正在 Excel 2010 年的 .xlam 文件中编写一个 VBA 宏。
当我尝试 运行 时,我得到了这个错误:
object variable or with block variable not set
它应该交换特定 table 中的列,当我 运行 它只是一个宏(不在加载项中)时,它工作得很好。
这是我的宏:
Sub SwapTable(ByVal control As IRibbonControl)
Dim LastCol As Long
Dim LastRow As Long
Dim Swaps As Long
Dim i As Integer
Dim DocumentTitle As String
Dim SearchDetails As String
LastRow = LastRowInOneColumn()
LastCol = LastColumnInOneRow(LastRow)
StartTitlesRow = Find_TitlesRow()
'copy title rows
With ActiveSheet
DocumentTitle = .Cells(StartTitlesRow - 3, 1).Value
SearchDetails = .Cells(StartTitlesRow - 2, 1).Value
End With
'check how many swaps needed
If LastCol Mod 2 = 0 Then
Swaps = LastCol / 2
Else
Swaps = (LastCol - 1) / 2
End If
'run swap
For i = 1 To Swaps
Call Swap(i, LastCol - i + 1, LastRow, StartTitlesRow - 1)
Next i
'past title rows
With ActiveSheet
.Cells(StartTitlesRow - 3, 1) = DocumentTitle
.Cells(StartTitlesRow - 2, 1) = SearchDetails
End With
Worksheets(1).Columns("A:EE").AutoFit
End Sub
Function LastColumnInOneRow(LastRow As Long) As Long
'Find the last used row in a Column: column A in this example
Dim LastCol As Long
With ActiveSheet
LastCol = .Cells(LastRow, .Columns.Count).End(xlToLeft).Column
End With
LastColumnInOneRow = LastCol
End Function
Function LastRowInOneColumn() As Long
'Find the last used row in a Column: column A in this example
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
LastRowInOneColumn = LastRow
End Function
Function Find_TitlesRow() As Long
Dim SearchString As String
Dim StartTitlesRow As Long
SearchString = "ùåøä"
With ActiveSheet
Set cl = .Cells.Find(What:=SearchString, _
After:=.Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not cl Is Nothing Then
StartTitlesRow = cl.Row
Else
MsgBox "Could'nt find start row"
End If
End With
Find_TitlesRow = StartTitlesRow
End Function
Function Swap(Col1 As Integer, Col2 As Integer, LastRow As Long, StartTableRow As Variant)
Dim FirstCol As Variant
Dim SecondCol As Variant
Dim temp As Variant
temp = Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value
Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value = Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value
Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value = temp
End Function
避免使用 ActiveSheet
!它只会给你带来类似你遇到的问题,你不确定它引用的是哪个 sheet 。出于同样的原因,避免 ActiveWorkbook
。
相反,获取对 sheet 您想要使用的引用:
Dim oWb As Workbook
Dim oSheet As Worksheet
Set oWb = Workbooks("[WORKBOOKNAME]")
'***** or use index like Workbooks(1)
If Not oWb Is Nothing Then
Set oSheet = oWb.Sheets("[WORKSHEETNAME]")
'***** or use index like Sheets(1)
End If
If Not oSheet Is Nothing Then
'***** Do your stuff
'past title rows
With oSheet
.Cells(StartTitlesRow - 3, 1) = DocumentTitle
.Cells(StartTitlesRow - 2, 1) = SearchDetails
End With
'***** etc
End If
或者您可以像在某些地方已经使用的那样使用索引,但您还需要指定一个工作簿,以避免使用 ActiveWorkbook:
oWb.Worksheets(1).Columns("A:EE").AutoFit
我正在 Excel 2010 年的 .xlam 文件中编写一个 VBA 宏。
当我尝试 运行 时,我得到了这个错误:
object variable or with block variable not set
它应该交换特定 table 中的列,当我 运行 它只是一个宏(不在加载项中)时,它工作得很好。 这是我的宏:
Sub SwapTable(ByVal control As IRibbonControl)
Dim LastCol As Long
Dim LastRow As Long
Dim Swaps As Long
Dim i As Integer
Dim DocumentTitle As String
Dim SearchDetails As String
LastRow = LastRowInOneColumn()
LastCol = LastColumnInOneRow(LastRow)
StartTitlesRow = Find_TitlesRow()
'copy title rows
With ActiveSheet
DocumentTitle = .Cells(StartTitlesRow - 3, 1).Value
SearchDetails = .Cells(StartTitlesRow - 2, 1).Value
End With
'check how many swaps needed
If LastCol Mod 2 = 0 Then
Swaps = LastCol / 2
Else
Swaps = (LastCol - 1) / 2
End If
'run swap
For i = 1 To Swaps
Call Swap(i, LastCol - i + 1, LastRow, StartTitlesRow - 1)
Next i
'past title rows
With ActiveSheet
.Cells(StartTitlesRow - 3, 1) = DocumentTitle
.Cells(StartTitlesRow - 2, 1) = SearchDetails
End With
Worksheets(1).Columns("A:EE").AutoFit
End Sub
Function LastColumnInOneRow(LastRow As Long) As Long
'Find the last used row in a Column: column A in this example
Dim LastCol As Long
With ActiveSheet
LastCol = .Cells(LastRow, .Columns.Count).End(xlToLeft).Column
End With
LastColumnInOneRow = LastCol
End Function
Function LastRowInOneColumn() As Long
'Find the last used row in a Column: column A in this example
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
LastRowInOneColumn = LastRow
End Function
Function Find_TitlesRow() As Long
Dim SearchString As String
Dim StartTitlesRow As Long
SearchString = "ùåøä"
With ActiveSheet
Set cl = .Cells.Find(What:=SearchString, _
After:=.Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not cl Is Nothing Then
StartTitlesRow = cl.Row
Else
MsgBox "Could'nt find start row"
End If
End With
Find_TitlesRow = StartTitlesRow
End Function
Function Swap(Col1 As Integer, Col2 As Integer, LastRow As Long, StartTableRow As Variant)
Dim FirstCol As Variant
Dim SecondCol As Variant
Dim temp As Variant
temp = Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value
Sheets(1).Range(Cells(StartTableRow, Col1), Cells(LastRow, Col1)).Value = Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value
Sheets(1).Range(Cells(StartTableRow, Col2), Cells(LastRow, Col2)).Value = temp
End Function
避免使用 ActiveSheet
!它只会给你带来类似你遇到的问题,你不确定它引用的是哪个 sheet 。出于同样的原因,避免 ActiveWorkbook
。
相反,获取对 sheet 您想要使用的引用:
Dim oWb As Workbook
Dim oSheet As Worksheet
Set oWb = Workbooks("[WORKBOOKNAME]")
'***** or use index like Workbooks(1)
If Not oWb Is Nothing Then
Set oSheet = oWb.Sheets("[WORKSHEETNAME]")
'***** or use index like Sheets(1)
End If
If Not oSheet Is Nothing Then
'***** Do your stuff
'past title rows
With oSheet
.Cells(StartTitlesRow - 3, 1) = DocumentTitle
.Cells(StartTitlesRow - 2, 1) = SearchDetails
End With
'***** etc
End If
或者您可以像在某些地方已经使用的那样使用索引,但您还需要指定一个工作簿,以避免使用 ActiveWorkbook:
oWb.Worksheets(1).Columns("A:EE").AutoFit