2016-07-05 3 views
0

Я пишу макрос VBA в Excel 2010 в файле .xlam.ошибка во время работы надстройки VBA

Когда я пытаюсь запустить его, я получаю эту ошибку:

object variable or with block variable not set

Предполагается поменять местами столбцы в определенной таблице, и когда я запускаю его как только макрос (не в надстройке) его работает отлично. Это мой макрос:

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 
+1

Какая строка дает ошибку? Что такое 'ActiveSheet', когда вы запускаете его как надстройку? –

+0

it doent show wich line! и «ActiveSheet» является листом таблицы. – ALEXM

+1

Это странно. Обычно местоположение курсора при разрыве макросов даст вам представление о том, какая строка. Повторение: что такое 'ActiveSheet', когда вы запускаете его как надстройку? –

ответ

2

Избегайте использования ActiveSheet! Это только даст вам проблемы, такие как тот, который у вас есть, где вы не уверены, на каком листе он ссылается. Избегайте ActiveWorkbook, пока вы на нем, по той же причине.

Вместо этого, получить ссылку на лист, который вы хотите работать с:

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 
Смежные вопросы