Как редактировать информацию в ячейках, отображаемых с помощью макрокода в Excel? - PullRequest
1 голос
/ 18 марта 2011

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 15 февраля 2016

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

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

Вам потребуется пара открытых переменных. Один, чтобы запомнить положение, в которое должны быть возвращены изменения, и другой, чтобы найти целевые ячейки на Листе 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

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

0 голосов
/ 18 марта 2011

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

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

  • копия строки sheet1в sheet2 (текущий макрос)
  • копировать номер строки sheet1 в sheet2 (т.е. на одну строку вниз)
  • внести изменения в sheet2
  • копировать строку sheet2 в строку sheet1 (использовать строку #сохранено на листе 2) -> предполагается, что в лист 1 не будет внесено никаких изменений.
...