Простой макрос VBA для перечисления всех рабочих листов приводит к ошибке: Несоответствие типов - PullRequest
3 голосов
/ 28 ноября 2011

Я делаю ExcelComparer, но сталкиваюсь с, вероятно, очевидной ошибкой, я явно что-то упустил.

Я запускаю макрос vba в Excel 2007

Я получаю точную ошибку "Ошибка времени выполнения 13: Несоответствие типов "Это происходит, когда цикл пытается извлечь второе имя листа.
Итак, первое имя листа возвращается нормально

Ниже вы найдете макрос

Заранее спасибо, L

Sub compare()

Dim strWorkbook1, strWorkbook2 As String
Dim Workbook1, Workbook2 As Workbook
strWorkbook1 = Worksheets("Sheet1").Range("C5") & Worksheets("Sheet1").Range("D5")
strWorkbook2 = Worksheets("Sheet1").Range("C6") & Worksheets("Sheet1").Range("D6")

Set xlapp = CreateObject("Excel.application")
Set Workbook1 = xlapp.Workbooks.Open(strWorkbook1)
xlapp.Visible = False

Dim ws As Worksheet
For Each ws In Workbook1.Sheets
  'ws.Select
  If Not ws.Visible = xlSheetVeryHidden Then
      MsgBox (ws.Name)
  End If
Next ws
xlapp.Close
End Sub

Ответы [ 2 ]

8 голосов
/ 28 ноября 2011

Используйте это для цикла For:

For Each ws In Workbook1.Worksheets

От MSDN разница между свойствами Sheets и Worksheets:

Это свойство не возвращает листы макроса, диаграммы или диалоговые листы. Используйте свойство Sheets, чтобы вернуть эти листы, а также рабочие листы. Вы также можете использовать специализированные свойства Excel4MacroSheets и Excel4IntlMacroSheets для возврата макросов и свойства диаграмм вернуть графики.

1 голос
/ 29 ноября 2011

[Отредактировал мой первоначальный ответ, так как я проверял различные переменные, что сделало мой комментарий некорректным]

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

Вы должны

  1. закрыть автоматизированную рабочую книгу (Workbook1.Close False)
  2. выйти из автоматизированного приложения (xlapp.Quit)
  3. Убедитесь, что автоматизированное приложение уничтожено (Set xlapp = Nothing) a

Рабочая часть вашего кода должна выглядеть следующим образом

Dim ws As Worksheet
For Each ws In Workbook1.WorkSheets
  If Not ws.Visible = xlSheetVeryHidden Then MsgBox (ws.Name)
Next ws
Workbook1.Close False
xlapp.Quit
Set xlapp = Nothing
End Sub
...