VBA/Excel Ошибка с Find: переменная объекта не установлена ​​или несоответствие типов

В этом макросе я извлекаю сетевые данные из Visio и помещаю их в файл Excel. В файле visio есть объекты, которые могут появляться несколько раз, но я хочу, чтобы эти элементы были указаны в файле Excel только один раз. Таким образом, перед вводом новой записи макрос сначала ищет диапазон ранее записанных данных. Ошибка приходит в команде.Find. Разочарование в том, что макрос будет запускаться один раз, а затем завершаться ошибкой при последующих запусках. Но если я сброслю его, он запустится еще раз. Я на самом деле попробовал два немного разных способа поиска. Первый метод привел к ошибке "объектная переменная с блочной переменной не установлена". Второй метод привел к ошибке "несоответствие типов". Вот соответствующая часть кода (ошибка раздела с **)

Dim oXLApp As Excel.Application
Dim oXLBook As Excel.Workbook
Dim oXLSheet As Excel.Worksheet
Set oXLApp = New Excel.Application    'Create a new instance of Excel
oXLApp.Visible = True
Dim iSheetsPerBook As Integer         'Add a new workbook (with one sheet)
iSheetsPerBook = oXLApp.SheetsInNewWorkbook
oXLApp.SheetsInNewWorkbook = 4
Set oXLBook = oXLApp.Workbooks.Add
oXLApp.SheetsInNewWorkbook = iSheetsPerBook
Set oXLSheet = oXLBook.Worksheets(1) 
Dim CurrentTrans As String
Dim RangeObj As Range

Application.ActiveWindow.SelectAll
Dim RowCounter As Integer
Dim ColCounter As Integer
Dim NeededSpaces As Integer
RowCounter = 1

For x = 1 To ActiveWindow.Selection.Count 'iterate all selected shapes
    Dim vsoshape As Visio.shape
    Dim vsoShapetype As String
    Set vsoshape = ActiveWindow.Selection(x) 'activate next selected shape

    If Not vsoshape Is Nothing Then
        If InStr(vsoshape.Name, "Circle") > 0 Then
          Dim lngOutGoingShapeIDs() As Long
          Dim lngIncomingShapeIDs() As Long
          lngOutGoingShapeIDs = vsoshape.ConnectedShapes(visConnectedShapesOutgoingNodes, "")
          lngIncomingShapeIDs = vsoshape.ConnectedShapes(visConnectedShapesIncomingNodes, "")

          Dim NewTrans As Integer  'Flag to show if Transition is new (=1) or was previously listed (=0)
          NewTrans = 1             ' Reset flag to 1, assumes transition is new
          ColCounter = 2                ' Reset ColCounter to 2

          If Not IsEmpty(oXLSheet.Cells(1, 1).Value) Then  'Previous Firing Data Exists, Must check listed transitions to avoid duplication
            oXLSheet.Range("A1", oXLSheet.Range("A1").End(xlDown)).Select
            CurrentTrans = vsoshape.Text
            Debug.Print CurrentTrans
            **Set RangeObj = Selection.Find(What:=CurrentTrans, After:=ActiveCell, LookIn:=xlFormulas, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)**
            If RangeObj Is Nothing Then   'This is a new tranisition with no previous Firing data listed
                oXLSheet.Range("A1").End(xlDown).Activate
                RowCounter = ActiveCell.Row + 1

Ошибка в 'Set RangeObj ...'. В этом случае макрос будет успешно запущен один раз. Но последующие попытки приводят к ошибке "Переменная объекта с переменной блока не установлена". Если vba сброшен, он снова запустится. Если я вместо этого устанавливаю RangeObj следующим образом, я получаю "Ошибка времени выполнения 13 несоответствие типов".

   Set RangeObj = oXLSheet.Range("A1", oXLSheet.Range("A1").End(xlDown)).Find(What:=CurrentTrans, After:=ActiveCell, LookIn:=xlFormulas, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)

Как и в случае предыдущей проблемы, она будет запущена один раз, а затем завершится с ошибкой на этом этапе, пока макрос не будет сброшен. Я проверил переменную "CurrentTrans", которую я ищу, и это всегда строка. Я установил его для просмотра листа Excel, и диапазон, который нужно искать, всегда содержит строки.

Это очень неприятно, поэтому любая помощь будет принята с благодарностью. Заранее спасибо.

1 ответ

Попробуйте что-то вроде этого. (Непроверенные)

'
'~~> Rest of the code
'

Dim Lrow As Long
Dim rngF As Range

With oXLSheet
    Lrow = .Range("A" & .Rows.Count).End(xlUp).Row

    Set rngF = .Range("A1:A" & Lrow)
End With

CurrentTrans = vsoshape.Text

Set RangeObj = rngF.Find(What:=CurrentTrans, LookIn:=xlFormulas, _
                    LookAt:=xlWhole, SearchOrder:=xlByRows, _
                    SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False)

'
'~~> Rest of the code
'
Другие вопросы по тегам