2015-03-10 5 views
1

Я изо всех сил пытаюсь выяснить, как я могу перебирать все строки в excel от слова. Я хочу добиться того, что если в столбце WP в excel есть что-то, сохраните активный worddocument с этим именем файла. Однако я не могу найти что-то простое, как получить последнюю строку (может быть, пустые строки между ними), я просто получаю код ошибки 424, который, согласно MSDN, не дает мне никакого реального намека, что неправильно. Какие-нибудь идеи в чем-то не так?Как пройти через лист excel от слова

Public Sub test() 
Dim xlapp As Object 
Set xlapp = CreateObject("Excel.Application") 

myFileName = "Z:\Dokumentstyring\UnderArbeid\PARTSLIST.xlsm" 
xlapp.Workbooks.Open myFileName 
xlapp.Application.ScreenUpdating = False 
xlapp.Visible = False 

a = xlapp.sheets("List").Range("A1").Value 
b = firstBlankRow(xlapp) 
c = getColumn("WP", xlapp) 

xlapp.Application.ScreenUpdating = True 
xlapp.ActiveWorkbook.Close (True) 
xlapp.Quit 
Set xlapp = Nothing 
End Sub 

Моя функция получить последнюю строку:

Function firstBlankRow(ByRef xlapp) As Long 
'returns the row # of the row after the last used row 
'Or the first row with no data in it 

With xlapp.sheets("List") 
    '~~> Check if there is any data in the sheet 
    'If xlapp.WorksheetFunction.CountA(.Cells) <> 0 Then 
     firstBlankRow = .Range("A" & .Rows.Count).End(Excel.XlDirection.xlUp).Row 
    'Else 
     firstBlankRow = 1 
    'End If 

End With 
End Function 

Вот моя функция для получения столбца номер

Public Function getColumn(header As String, ByRef xlapp) As Integer 
    Dim rng1 As Range 
    With xlapp.sheets("List") 
     Set rng1 = .Range(.Cells(1, 1), .Cells(1, Columns.Count)).Find(header, , xlValues, xlWhole) 
     If Not rng1 Is Nothing Then 
      getColumn = rng1.Column 
     Else 
      MsgBox "Column " & header & " does not exist, Typo??", vbCritical 
      getColumn = -1 
     End If 

    End With 
End Function 
+0

Отлаживайте свой код шаг за шагом, используя F8. Это скажет вам, какая линия вызывает проблему. –

+0

Спасибо @JLILI, с этим кодом я получаю ошибку 1004. Ой, жаль, что я забыл упомянуть, какая строка не удалась в исходном сообщении. Он не может найти значение xlup, если я установил его в 1, он пройдет, но вернет неправильный номер. Тогда это не сработает здесь: 'getColumn = rng1.Column' – skatun

+0

Можете ли вы добавить' debug.print (rng1.Address (External: = False)) 'после' Set rng1 = .Range (.Cells (1, 1),. Ячейки (1, Columns.Count)). Найдите (header,, xlValues, xlWhole) 'и скажите, что он печатает? –

ответ

0

Согласно нашей беседы в комментариях, измените Dim Rng1 As Range на Dim Rng1 As Object.

Вы можете найти актуальные значения XlDirection, Xlvalues, xlwhole перечисления.

Предпочтительно, чтобы это лучше сделать это следующим образом:

Private Const xlUp as long = -4162 
'and so on 

Edit1:

Вот скорректированный функция, которая решает вашу проблему (я проверил это на моей машине)

Public Function getColumn(header As String, ByRef xlapp) As Long 
     Dim rng1 As Object 
     With xlapp.sheets("List") 
      Set rng1 = .Range(.Cells(1, 1), .Cells(1, .Columns.Count)) 
      If rng1 Is Nothing Then 
      MsgBox ("ERROR: Range object is empty.") 
      getColumn = -1 
      Exit Function 
      End If 
      For Each m In rng1 
      If m = "WP" Then 
      getColumn = m.Column 
      Exit Function 
      End If 
      Next m 
      MsgBox "Column " & header & " does not exist, Typo??", vbCritical 
      getColumn = -1 
     End With 
    End Function 
+0

'Private Const xlUp = -4162 Частный Const xlWhole = 1 Частный Const xlValue = -4163' Кажется, значения, как указано выше, но метод rng.find не может быть найден из слова.То, что я пытаюсь достичь, - это получить номер столбца, где можно найти текст «WP». 'c = getColumn (" WP ", xlapp)', потому что люди склонны добавлять или удалять столбцы из рабочего листа, и, следовательно, статический номер столбца, к сожалению, не работает для меня. Я выложу окончательный код и поставлю его как ответ, как только я его заработаю. – skatun

+0

@skatun, пожалуйста, проверьте мой ответ. Я надеюсь, что это поможет вам, товарищ инженер;) –

+0

Спасибо, это работает – skatun

Смежные вопросы