Ошибка с выбором диапазона - PullRequest
2 голосов
/ 22 декабря 2011

У меня проблемы с куском кода. Я получаю сообщение об ошибке при выборе диапазона

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim valrand As Long
If Intersect(Target, ActiveCell) = "Insert line" Then
valrand = ActiveCell.Row
    If Worksheets("IR").Cells(valrand, 18).Value <> 5 Then
        Sheets("Format").Select
        MsgBox ("Format")
        Range("A13:N13").Select 'here's the error
        Selection.Copy

        Sheets("IR").Select
        Range("A" & valrand + 2 + Worksheets("IR").Cells(12, 18) & ":N" & valrand + 2 + Worksheets("IR").Cells(12, 18)).Select
        Selection.Insert Shift:=xlDown

        Range("A38:N38").Select
        Application.CutCopyMode = False
        Selection.Delete Shift:=xlUp

        Range("A5").Select
        contor = Worksheets("IR").Cells(12, 18).Value + 1
        Worksheets("IR").Cells(12, 18).Value = contor
    End If
End If
End Sub

Там, где я помещаю комментарий "вот ошибка", он дает мне "Выбор метода класса Range не выполнен" Что я делаю неправильно? Обычно этот кусок кода работал до того, как я добавил его в блок кода SelectionChange. Спасибо!

1 Ответ

6 голосов
/ 22 декабря 2011

Вам следует избегать Select при использовании Листового кода (лучше всего избегать его вообще, об этом позже) и использовать вместо этого что-то подобное

Application.Goto Sheets("Format").Range("A13:N13")

(я пытался полностью квалифицировать ссылку, но это работало, только если я использовал

   Sheets("Format").Select
   Sheets("Format").Range("A13:N13").Select

, что явно излишне)

Хотя это решает вашу непосредственную проблему, вам следует взглянуть на консолидацию кода, например

  1. Отключение событий, чтобы другие листовые события не срабатывали, пока запущен ваш выбор
  2. Удаление любых Select операторов

Это пример того, что может работать лучше (теперь без активации листа)

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim lngRand As Long
    Dim rng1 As Range
    Set ws1 = Sheets("Format")
    Set ws2 = Sheets("IR")
    If Intersect(Target, ActiveCell) = "Insert line" Then
        lngRand = ActiveCell.Row
        If ws2.Cells(lngRand, 18).Value <> 5 Then
            Application.EnableEvents = False
            Set rng1 = Range("A" & lngRand + 2 + ws2.Cells(12, 18))
            'extend rng1 from column A to colum N
            Set rng1 = rng1.Resize(rng1.Rows.Count, 14)
            ws2.Range(rng1.Address).Insert xlDown
            'copy Format to IR
            ws1.Range("A13:N13").Copy ws2.Range(rng1.Address)
            'Update Format
            ws2.Range("A38:N38").Delete Shift:=xlUp
            ws2.Cells(12, 18).Value = ws2.Cells(12, 18).Value + 1
            Application.EnableEvents = True
        End If
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...