Excel VBA - получить верхнюю ячейку из столбца, где объединена верхняя ячейка - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть макрос, в котором я прохожу столбцы и определяю, соответствует ли «верхняя» ячейка (строка 7, потому что есть различные нерелевантные заголовки) определенным указанным значениям, а затем выполняю различные действия.

Проблема в том, что некоторые заголовки являются объединенными ячейками.Это означает, что код правильно распознает только столбцы, которые выровнены по крайнему левому столбцу, который расположен в ячейке заголовка.Очевидно, мне нужно изменить это, чтобы решить это.

Я не знаю, как заставить это записать значение, например, для столбца D и столбца E, где объединенная ячейка в столбцах D и E говорит «менеджер» или «директор».

На данный момент я только что включил готовое действие ("y = 22"), потому что я пытаюсь понять основной принцип прямо перед прогрессом.

Sub LabourCalc()

    Dim x As Variant
    Dim y As Variant

    Workbooks("XXX").Activate
    Sheets("XXX").Activate

    For x = 1 To 10
        If InStr(Cells(7, x).Value, "MANAGER") _
        Or InStr(Cells(7, x).Value, "manager") _
        Or InStr(Cells(7, x).Value, "Manager") _
        Or InStr(Cells(7, x).Value, "DIRECTOR") _
        Or InStr(Cells(7, x).Value, "Director") _
        Or InStr(Cells(7, x).Value, "director") Then
            y = 22
        End If
    Next x

End Sub

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Используйте свойство Range.MergeArea.

Возвращает объект Range, представляющий объединенный диапазон, содержащий указанную ячейку.Если указанная ячейка не находится в объединенном диапазоне, это свойство возвращает указанную ячейку.

Так, например, если D7:E7 является объединенной ячейкой:

  • Cells(7, 4).MergeArea.Cells(1, 1) относится к D7
  • Cells(7, 5).MergeArea.Cells(1, 1) также относится к D7.Ячейка E7 пуста.

И если F7 это , а не объединенная ячейка:

  • Cells(7, 6).MergeArea.Cells(1, 1) относится к F7.

Как указал @ValonMiller в комментариях, вы можете упростить несколько экземпляров InStr, сначала преобразовав содержимое Cells(7, x) в верхний регистр, используя UCase.

* 1041.* Ваш последний цикл может выглядеть следующим образом:
With Workbooks("XXX").Sheets("XXX")
    For x = 1 To 10
        With .Cells(7, x).MergeArea.Cells(1, 1)
            If InStr(UCase(.Value), "MANAGER") Or InStr(UCase(.Value), "DIRECTOR") Then
                ' Do your stuff here
            End If
        End With
    Next x
End With
0 голосов
/ 27 сентября 2018

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

Sub LabourCalc()

    Dim wb as Workbook
    Set wb = Workbooks("XXX")

    Dim ws as Worksheet
    Set ws = wb.Worksheets("XXX")

    For x = 1 To 10
        Select Case UCase$(ws.Cells(7,x).MergeArea.Cells(1,1))
            Case is = "MANAGER","DIRECTOR"
                'do stuff here
        End Select
    Next

End Sub

Если вам необходимо проверить, есть ли в ячейке менеджер или директор, сделайте следующее:

Dim checkValue as String
checkValue = UCase$(ws.Cells(7,x).MergeArea.Cells(1,1))

Select Case Instr(checkValue,"MANAGER") > 0 Or Instr(checkValue,"DIRECTOR") > 0
    Case is = True
        'do stuff
End Select
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...