Как я могу установить значение ячейки в ячейке (). Выберите команду для значения ячейки, в которой есть формула? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать макрос, который копирует значения внутри определенных ячеек sheet1 и вставляет их затем в sheet2.

Это формула, которую я написал в ячейке "AI2":

=IFERROR(SUM(1+AH:AH),"0")

и он выдает число, которое я хочу использовать в макросе в качестве переменной строки.

Это код, который я имею в своей рабочей таблице для запуска макроса:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
     If Range("AI2") <> 0 Then
     Call macro1
     End If
End Sub

А это макрос:

Sub macro1()
Dim RV As Integer
RV = Sheets("sheet1").Range("AI2").Value
Cells(RR, 33).Select
Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -1)).Select
Selection.Copy
Sheets("sheet2").Select
Range("A1048576").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

Если я удаляю первые 3 строки кода, макрос работает, но мне нужно вручную выбрать ячейку для смещений, на которые нужно ссылаться.

Мне нужно сделать так, чтобы значение ячейки «AI2» использовалось в качестве первой координаты в этой строке кода:

Cells(RR, 33).Select

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Копировать диапазон в первую пустую ячейку

Вычислить

Если вы используете формулу в диапазоне ячеек AI2, вам следует использовать Рабочий лист вычисления Событие, которое происходит при расчете формулы.

Стандартный модуль

Option Explicit

Public Const strRange As String = "AI2"
Public vntValue As Variant

Sub macro1()

    Dim rng As Range  ' Target Cell Range
    Dim RV As Long    ' Row Value

    ' In Target Worksheet
    With ThisWorkbook.Sheets("Sheet2")
        ' Calculate the first empty (unused) cell in column A (A1 not included).
        Set rng = .Cells(.Rows.Count, "A").End(xlUp).Offset(1)
    End With

    ' In Source Worksheet
    With ThisWorkbook.Worksheets("Sheet1")
        ' Write the value of Row Cell to Row Value.
        RV = .Range(strRange).Value
        With .Cells(RV, "AH") ' or 33
            ' Copy range from "AB" to "AG" in row defined by Row Value in
            ' Source Worksheet to the range from "A" to "F" in row of Target
            ' Cell Range in Target Worksheet.
            rng.Resize(, 6) = Range(.Offset(0, -6), .Offset(0, -1)).Value
        End With
    End With

End Sub

Лист1

Option Explicit

Private Sub Worksheet_Calculate()
    If vntValue <> Range(strRange).Value Then
        vntValue = Range(strRange).Value
        If Range(strRange).Value <> "0" Then macro1
    End If
End Sub

ThisWorkbook

Option Explicit

Private Sub Workbook_Open()
    vntValue = Worksheets("Sheet1").Range(strRange).Value
End Sub

Изменить

Если вы вручную изменяете значения в диапазоне ячеек AI2, вам необходимо используйте событие Изменение листа .

Стандартный модуль

Option Explicit

Sub macro1()

    Dim rng As Range  ' Target Cell Range
    Dim RV As Long    ' Row Value

    ' In Target Worksheet
    With ThisWorkbook.Sheets("Sheet2")
        ' Calculate the first empty (unused) cell in column A (A1 not included).
        Set rng = .Cells(.Rows.Count, "A").End(xlUp).Offset(1)
    End With

    ' In Source Worksheet
    With ThisWorkbook.Worksheets("Sheet1")
        ' Write the value of Row Cell to Row Value.
        RV = .Range("AI2").Value
        ' In cell at the intersection of Row Value and column "AH".
        With .Cells(RV, "AH") ' or 33
            ' Copy range from "AB" to "AG" in row defined by Row Value in
            ' Source Worksheet to the range from "A" to "F" in row of Target
            ' Cell Range in Target Worksheet.
            rng.Resize(, 6) = Range(.Offset(0, -6), .Offset(0, -1)).Value
        End With
    End With

End Sub

Лист1

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
     Const cCell As String = "AI2"
     If Target = Range(cCell) Then
         If Range(cCell).Value <> "0" Then macro1
     End If
End Sub

Как и в версии Calculate , вы также можете использовать открытую переменную (vntValue), чтобы предотвратить запуск macro1 в случае, если значение в диапазоне ячеек AI2 фактически не изменилось.

0 голосов
/ 13 февраля 2019

Я ограничиваю область действия вашего Worksheet_Change, чтобы оно срабатывало только тогда, когда изменение зарегистрировано в Column AH, поскольку этот столбец будет вызывать изменение формулы в Column AI


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 34 Then
        If Range("AI2") <> 0 Then
            Macro2
        End If
    End If
End Sub

Sub Macro2()

Dim cs As Worksheet: Set cs = ThisWorkbook.Sheets("Sheet1")
Dim ps As Worksheet: Set ps = ThisWorkbook.Sheets("Sheet2")

Dim xRow As Long, LR As Long
LR = ps.Range("A" & ps.Rows.Count).End(xlUp).Offset(1).Row
xRow = cs.Range("AI2").Value

cs.Range(cs.Cells(xRow, "AB"), cs.Cells(xRow, "AG")).Copy
    ps.Range("A" & LR).PasteSpecial xlPasteValues

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