Как редактировать информацию в ячейках, отображаемую с помощью кода макроса в Excel?

У меня есть макрос, поэтому, когда вы выделяете строку на листе1, макрос берет всю информацию из этой строки и отображает ее сам по себе на листе2. Если вы выделите другую строку на листе 1, информация на листе 2 изменится, чтобы показать информацию из этой строки.

Моя проблема в том, что если я изменю информацию, отображаемую на листе2, она не изменит информацию на листе1. Есть ли способ добавить эту функциональность?

На данный момент у меня есть следующий код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim myList
If Target.Address <> Target.EntireRow.Address Then Exit Sub
If Target.Rows.Count > 1 Then Exit Sub
myList = [{"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15"}] '<- adjust to your need
With Target.EntireRow
    For i = 1 To UBound(myList)
        Sheets("sheet2").Range(myList(i)).Value = .Cells(i).Value
    Next
End With
End Sub

Любая помощь будет потрясающей! :)


person ade123    schedule 18.03.2011    source источник
comment
Я не уверен, что делает ваш лист2 - нельзя ли запустить автофильтр на листе 1 с помощью вашего макроса?   -  person John M    schedule 18.03.2011
comment
Лист 2 предназначен только для того, чтобы упростить просмотр всего из определенной строки на листе 1 без необходимости прокручивать весь путь вправо от листа 1. Поэтому, когда я выделяю строку на листе 1, я могу перейти на лист 2 и четко просмотреть информацию из этой строки в вертикальном макете. Не уверены, есть ли лучший способ сделать это? Я немного новичок в этой области! :)   -  person ade123    schedule 18.03.2011
comment
Этот код будет работать, только если выделена вся строка. Если вы измените значение одной ячейки, строка If Target.Address <> Target.EntireRow.Address Then Exit Sub завершит процедуру без запуска оставшегося кода.   -  person matt_black    schedule 04.07.2012


Ответы (2)


После копирования строки листа1 на лист2 вы также можете записать исходную строку #, из которой были получены значения. Затем вы можете добавить дополнительный макрос, который будет сравнивать значения на листе2 со значениями на листе1 — тогда любые изменения можно будет перенести.

Возможный основной поток:

  • скопировать строку лист1 в лист2 (текущий макрос)
  • скопируйте номер строки листа 1 на лист 2 (т.е. на одну строку вниз)
  • внести изменения на лист2
  • скопируйте строку листа2 в строку листа1 (используйте строку #, сохраненную на листе2) -> это предполагает, что в лист1 не будут внесены никакие изменения.
person John M    schedule 18.03.2011
comment
ооооо... звучит немного сложно! :o( Я не очень хорошо разбираюсь в Excel, особенно в плане написания макросов. - person ade123; 18.03.2011
comment
@ ade123 - добавил еще несколько комментариев к моему ответу. - person John M; 18.03.2011

В настоящее время вы используете макрос события Worksheet_SelectionChange для распознавания полного была выбрана одна строка. Вам нужен макрос события Worksheet_Change, чтобы Sheet2 распознавал, когда значения в диапазон B1:B15 был изменен, и передайте изменения обратно в Sheet1.

Поскольку Worksheet_Change запускается при изменении значений, вам необходимо отключить Application.EnableEvents, чтобы оно не срабатывало, когда вы записываете значения из подкаталога Worksheet_SelectionChange листа1.

Вам потребуется несколько общедоступных переменных. Один для запоминания положения, в которое должны быть возвращены изменения, а другой для поиска целевых ячеек на Листе2. Они могут быть обнародованы только в листе кода модуля.

Книга 1 – Модуль 1 (код)

Option Explicit

Public Const sRNG As String = "B1:B15"
Public rRNG As Range

Я сделал несколько небольших изменений в вашем исходном Worksheet_SelectionChange и добавил отключение обработки событий.

Книга 1 – Лист 1 (код)

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count = Columns.Count And Target.Rows.Count = 1 And _
      CBool(Application.CountA(Target)) Then   '<~~ one complete non-blank row 
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        With Sheet2.Range(sRNG)
            Set rRNG = Target.Cells(1, 1).Resize(.Columns.Count, .Rows.Count)
            .Cells = Application.Transpose(rRNG.Value)
        End With
    End If

bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

Свойство Worksheet .CodeName использовалось для идентификации Sheet2 , так как это не изменится, если рабочий лист будет переименован обычным образом.

Немного неясно, как вы планировали идентифицировать строку для возврата значений после их изменения. Я использовал общедоступную переменную диапазона, объявленную в Module1, для записи последнего местоположения, в котором значения были переданы из Sheet1 в Sheet2. Изменения на Листе 2 вернут их в последнее записанное место.

Книга 1 – Лист 2 (код)

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(sRNG)) Is Nothing Then
        Debug.Print rRNG.Address(0, 0, external:=True)
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        rRNG = Application.Transpose(Range(sRNG).Value)
    End If

bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

Обратите внимание, что «запомненное» местоположение находится только в памяти. Закрытие и повторное открытие книги эффективно «обнуляет» ее. Не вносите изменения на Лист2, если у вас нет только что загруженных значений с Листа1.

person Community    schedule 15.02.2016