2015-02-05 3 views
0

Я совершенно новый в excel vba, и я был бы очень признателен, если вы можете мне помочь. Дело в том, что у меня есть ячейка, которая обновляется каждую минуту, потому что она связана с функцией Blomberg. Дело в том, что я хочу, чтобы каждый раз, когда обновлялись ячейки, excel копирует его и вставляет в другую, новую ячейку, которая может наблюдать внутридневные изменения. я придумал некоторые коды, но я могу скопировать и вставить только один, похожий cell.It выглядит следующим образом:обновить ячейку и вставить ее в другую ячейку vba

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Cells.Count > 1 Then Exit Sub 


If Not Intersect(Target, Range("E4")) Is Nothing Then 
Range("E4").Copy 
Range("E4").PasteSpecial xlPasteValues 
End If 

End Sub 

Любая помощь будет высоко оценен.

+0

Я не уверен, что понял хорошо, но если вы хотите (скажем), чтобы значение E4 было равно значению 'D4', почему вы просто не пишете' = E4' в ячейке ' D4'? –

+0

Он хочет журнал изменений. –

+0

P.s. в любом случае, среди различных проблем вы копируете ячейку 'E4' и вставляете ее в ячейку' E4'. Это действительно то, что вы хотите сделать? Также учтите, что это приведет к созданию бесконечного цикла (значение 'E4' будет постоянно перезаписываться и постоянно вызывать процедуру« Изменить »). –

ответ

0

Как насчет этого? Он будет передавать E4 на Sheet2 в новую строку каждый раз, когда E4 изменится.

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 
    If Target.Address = "$E$4" Then Sheets("Sheet2").Cells(Rows.Count, "F").End(xlUp).Offset(1) = Target 

End Sub 
0

Я принимаю предположение, что вы хотите регистрировать каждое изменение значений. Я бы посоветовал вести журнал на отдельном листе. Назовем это LogSheet.

Sub WriteLog(ByRef r As range) 
Dim Lastrow as integer 
With ThisWorkBook.WorkSheets("LogSheet") 
LastRow = .Cells(.Rows.Count,"A").End(XlUp).Row 
.Range("A" & LastRow + 1).Value = Now & " - " & r.Value 
End With 
End Sub 

Этот раздел будет в основном писать все изменения в колонке А нашего журнала с меткой времени!

Теперь нам нужно внести изменения в свой код, чтобы сообщать, делать журналы каждый раз, когда есть изменения. Чтобы сделать это, мы собираемся сделать вызов нашей функции и сказать, чтобы скопировать содержимое диапазона («Е4») (Тот, который обновляется все время)

If Not Intersect(Target, Range("E4")) Is Nothing Then 
'add this line 
WriteLog(ActiveSheet.Range("E4")) 

Попробуйте сейчас.

1

Если я правильно понял вашу проблему, вы хотите скопировать значение в новую ячейку для целей ведения журнала? Что я буду делать в этом случае есть еще один лист для регистрации значений с именем «logger_sheet» Я вставить значение в ячейке a1, когда обновления Blomberg ячейки, скопировать значение в мои logger_sheet клеток a2 когда он изменяет копию это a3, затем a4 и т. д.

Вот ваш обновленный код. Предполагается, что у вас есть лист с именем «logger_sheet» (если у вас его нет, создайте его), чтобы сохранить все предыдущие значения. Когда ячейка blomberg обновляется, она копирует значение и вставляет его в следующую доступную ячейку logging_sheet. Я разработал функцию, которая находит последнюю использованную строку в указанном листе и столбце. Попробуйте

Также есть строка вы можете раскомментировать, если вы хотите, чтобы предотвратить первенствовать мигания, я назвал его в коде

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 

    target_cell = "E4" 
    col_to_log_data = "A" 
    logging_Sheet = "logger_sheet" 

    If Not Intersect(Target, Range("E4")) Is Nothing Then 
     'uncomment this line to stop the "flashing" 
     'Application.ScreenUpdating = False 

     'gets the name of the current sheet 
     data_sheet = Range(target_cell).Parent.Name 
     Range(target_cell).Select 
     Selection.Copy 

     'gets the next free row from column a of the logging sheet (the next free row is 
     'the last used row + 1) 
     next_free_row = GetLastRowByColumn(CStr(col_to_log_data), CStr(logging_Sheet)) + 1 

     'pastes the value 
     Sheets(logging_Sheet).Range(col_to_log_data & CStr(next_free_row)).PasteSpecial Paste:=xlPasteValues 
     Application.CutCopyMode = False 

     'switches back to the data sheet 
     Sheets(data_sheet).Select 

     'make sure you turn screen updating on (if it was never off it still works) 
     Application.ScreenUpdating = True 
    End If 

End Sub 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
'this finds the last row in a specific column 
'PARAMS: col_to_check, the clumn we want the last row of 
'  Opt: sheet_name, the sheet you want to check last row of 
'    default is current sheet if not specified 
'RETURN: the last row number used in the sheet 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
Function GetLastRowByColumn(col_to_check As String, Optional sheet_name As String) 

    'gets current sheet name 
    the_current_sheet = ActiveSheet.Name 

    'if the user didnt' specify a sheet use the current one 
    If (Len(sheet_name) = 0) Then 
     sheet_name = the_current_sheet 
    End If 

    'gets last row 
    GetLastRowByColumn = Sheets(sheet_name).Range(col_to_check & "65536").End(xlUp).Row 

    'returns to original sheet 
    Sheets(the_current_sheet).Select 
End Function 

Если мой ответ решает вашу проблему, пожалуйста, отметьте его как решение

+0

Спасибо, что это помогло :) – user3618375

Смежные вопросы