У меня есть код, который ищет заголовок «РЕЗКА ИНСТРУМЕНТА» с использованием метода .Find. Он пропускает несколько файлов и несколько рабочих листов в открываемых файлах.VBA - не захватить заголовок в диапазоне
Я столкнулся с проблемой :, что, когда он проходит через несколько листов в одном открытом файле, а столбец пуст под заголовком, он печатает заголовок «РЕЗКА ИНСТРУМЕНТА». Это не делается на начальном листе или в книгах, которые не содержат нескольких рабочих листов. Есть идеи, как это исправить?
'(3)
'find CUTTING TOOL on the source sheet'
If Not ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then
Set hc = ws.Range("A1:M15").Find(What:="CUTTING TOOL", LookAt:=xlWhole, LookIn:=xlValues)
Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
If dict.count > 0 Then
'add the values to the master list, column 3
Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)
ElseIf dict = "" Then
StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0) = "NO CUTTING TOOLS PRESENT"
End If
ElseIf Not ws.Range("A1:M15").Find(What:="TOOL CUTTER", LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then ' find TOOL CUTTER on sheet
Set hc = ws.Range("A1:M15").Find(What:="TOOL CUTTER", LookAt:=xlWhole, LookIn:=xlValues)
Set dict = GetValues(hc.Offset(1, 0), "SplitMe")
If dict.count > 0 Then
'add the values to the master list, column 3
Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
d.Resize(dict.count, 1).Value = Application.Transpose(dict.items)
Else
End If
Else
If hc3 Is Nothing Then
StartSht.Range(StartSht.Cells(i, 3), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = "NO CUTTING TOOLS PRESENT!"
End If
End If
...
...
End Sub
...
...
'(8)
'get all unique column values starting at cell c
Function GetValues(ch As Range, Optional vSplit As Variant) As Object
Dim dict As Object
Dim rng As Range, c As Range
Dim v
Dim spl As Variant
Set dict = CreateObject("scripting.dictionary")
For Each c In ch.Parent.Range(ch, ch.Parent.Cells(Rows.count, ch.Column).End(xlUp)).Cells
v = Trim(c.Value)
If Not dict.exists(v) Then
If Len(v) > 0 Then
'exclude any info after ";"
If Not IsMissing(vSplit) Then
spl = Split(v, ";")
v = spl(0)
End If
'exclude any info after ","
If Not IsMissing(vSplit) Then
spl = Split(v, ",")
v = spl(0)
End If
End If
dict.Add c.Address, v
End If
If Len(v) = 0 Then
v = "none"
End If
Next c
Set GetValues = dict
End Function
'(9)
'find a header on a row: returns Nothing if not found
Function HeaderCell(rng As Range, sHeader As String) As Range
Dim rv As Range, c As Range
For Each c In rng.Parent.Range(rng, rng.Parent.Cells(rng.Row, Columns.count).End(xlToLeft)).Cells
'copy cell value if it contains some string "holder" or "cutting tool"
If Trim(c.Value) = sHeader Then
Set rv = c
Exit For
End If
Next c
Set HeaderCell = rv
End Function
Вы хотите, чтобы буквально использовать строку 'Else Then', потому что, когда я пытаюсь это сделать, она возвращает компиляционную ошибку, указывающую _Syntax Error_. Если я переведу 'Then' вниз по строке, я получаю компиляционную ошибку _Expected: номер строки или ярлык или оператор или конец оператора_ @ChipsLetten – Taylor
Кроме того, когда я помещаю в строку' Function GetValues (ch As Range, Optional vSplit As Variant) Как Scripting.Dictionary', я возвращаю ошибку компиляции: определяемый пользователем тип не определен .. Я не уверен, что не определено, поэтому я не могу найти, где это происходит Неправильно – Taylor
Извинения, 'Else Then' ошибочны. Просто используйте 'Else'. Чтобы использовать раннее связывание с 'Scripting.Dictionary', из VBA IDE выберите Tools -> References и найдите запись для« Microsoft Scripting Runtime »и установите флажок. – ChipsLetten