Использование Target.Address для ссылки на диапазон - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь использовать MsgBox при выборе ячейки. Мне нужно, чтобы в зависимости от выбранной ячейки появлялись разные окна сообщения, поэтому я пытаюсь использовать оператор и IF. Что-то идет не так, и я не знаю, что это такое. Вот код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.Calculate

Dim ws1 As Worksheet, ws2 As Worksheet
Dim rngPH1, rngPH2, rngPH3, rngPH4, rngPH5, rngPH6, rngPH7, rngPH8 As Range

Set ws1 = Worksheets("Budget Hours")
Set ws2 = Worksheets("Schedule")

Set rngPH1 = ws2.Range("E7:E27")
Set rngPH2 = ws2.Range("E43:E63")
Set rngPH3 = ws2.Range("E79:E99")
Set rngPH4 = ws2.Range("E115:E135")
Set rngPH5 = ws2.Range("E151:E171")
Set rngPH6 = ws2.Range("E187:E207")
Set rngPH7 = ws2.Range("E222:E242")
Set rngPH8 = ws2.Range("E259:E279")

If Target.Address = rngPH1 Then
    Dim rng1 As Range, rng2 As Range, msg1, i1 As Long
    
    Set rng1 = ws1.Range("E6:E10")
    Set rng2 = rng1.Offset(0, Target.Row - 6)

    msg1 = rng2.EntireColumn.Cells(3).Value & vbNewLine
    For i1 = 1 To rng1.Cells.Count
        msg1 = msg1 & vbNewLine & rng1.Cells(i).Value & " - " & rng2.Cells(i).Value & " Hours"
    Next i1

MsgBox msg1, , ws1.Range("E5").Value

ElseIf Target.Address = rngPH2 Then
    Dim rng3 As Range, rng4 As Range, msg2, i2 As Long
    
    Set rng3 = ws1.Range("E15:E19")
    Set rng4 = rng3.Offset(0, Target.Row - 42)

    msg2 = rng4.EntireColumn.Cells(3).Value & vbNewLine
    For i2 = 1 To rng3.Cells.Count
        msg2 = msg2 & vbNewLine & rng3.Cells(i).Value & " - " & rng4.Cells(i).Value & " Hours"
    Next i2

MsgBox msg2, , ws1.Range("E14").Value

End If
End Sub

Я получаю сообщение об ошибке «Несоответствие типов» в первом выражении IF. Это почему? Что я могу сделать, чтобы обойти это?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

If Target.Address = rngPH1

Несоответствие типов связано с тем, что левая часть - это String, а правая часть эквивалентна rngPH1.Value, что является 2D Variant массив.

Обычный подход - использовать Intersect:

If Not Intersect(Target, rngPH1) Is Nothing Then
0 голосов
/ 10 июля 2020

Ответ на ваш вопрос предоставлен @ BigBen.

Однако ваш код полный шаблонов, которые вам следует подумать об использовании. Использование доступных шаблонов в потоке кода значительно сократит количество строк кода и поможет сделать его более динамичным c и управляемым. Я подозреваю, что в ближайшем будущем вы продолжите добавлять операторы «if» к rngPH3 - rngPH8. Я использовал шаблоны в вашем коде и сократил его до следующего:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.Calculate
    
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rngPH As Range, rng1 As Range, rng2 As Range
    Dim msg As String, i As Long, j As Long
    
    Set ws1 = Worksheets("Budget Hours")
    Set ws2 = Worksheets("Schedule")
    
    For i = 1 To 8
    
        Set rngPH = ws2.Range("E" & 7 + (i - 1) * 36).Resize(21, 1)
        If Not Intersect(rngPH, Target) Is Nothing Then
            
            Set rng1 = rngPH.Cells(1, 1).Offset(-1, 0).Resize(5, 1)
            Set rng2 = rng1.Offset(0, Target.Row - rng1.Cells(1, 1).Row)
            
            msg = rng2.EntireColumn.Cells(3).Value & vbNewLine
            
            For j = 1 To rng1.Cells.Count
                msg = msg & vbNewLine & rng1.Cells(j).Value & " - " & rng2.Cells(j).Value & " Hours"
            Next j

            MsgBox msg, , rng1.Cells(1, 1).Offset(-1, 0).Value

            Exit For
        End If
    
    Next i
    
End Sub

Важные примечания:

  • Это logi c будет работает только тогда и только тогда, когда rngPH7 в исходном коде действительно должно быть установлено на ws2.Range("E223:E243"). Если это не так, вы можете просто добавить пустую строку где-нибудь выше, чтобы она соответствовала шаблону.

  • Этот код НЕ был протестирован и возможные ошибки и ошибки может существовать или не существовать. Моя единственная цель здесь - показать вам усилия и время, которые вы сэкономите в долгосрочной перспективе, если потратите несколько дополнительных минут (в некоторых случаях даже часы) вначале, чтобы проанализировать свою проблему и выработать какие-либо шаблоны.

Всего наилучшего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...