Есть ли способ в Excel VBA динамически изменять номер строки с курсором в коде, но не номер столбца? - PullRequest
0 голосов
/ 03 марта 2020

Уважаемые VBA / Macro Experts,

У меня есть задача получить данные на основе либо штрих-кода первого столбца, либо кода SKU второго столбца. Он будет извлекать данные из мастер-листа для ДЕТАЛЕЙ ПРОДУКТА и Продажной цены, а затем отобразится окно ввода для ввода количества, а после ввода количества он рассчитает сумму путем умножения цены продажи и количества. Я создал комбинацию клавиш для выполнения кода.

Ниже прикреплена ссылка на изображение моих столбцов, и когда я нажимаю, чтобы запустить мой код, он все делает и снова начинает со строки fre sh. Но мое требование заключается в том, что, когда я нажимаю клавишу быстрого доступа, она должна перейти к столбцу, к которому должна применяться формула, в данном случае, к столбцам C и D. Я не могу найти правильный путь, где при вводе клавиши быстрого вызова она должна начинаться из столбца C и D, а курсор должен заканчиваться на в первом столбце следующего ряда. Потому что сейчас я вручную перемещаю курсор после ввода штрих-кода или кода SKU, а затем перемещаю курсор на C, чтобы применить комбинацию клавиш. Но его следует динамически применять ко всем строкам одного и того же столбца.

мой код:

Sub EasyTool()
'
' EasyTool for Platina Sales
'
' Keyboard Shortcut: Ctrl+q

'
  'This will apply vlookup formula in column C and D

    ActiveCell.Select
    ActiveCell.FormulaR1C1 = _
        "=IF(ISBLANK(RC[-2]),VLOOKUP(RC[-1],master_data!R1C2:R1000C3,2,FALSE),VLOOKUP(sale!RC[-2],master_data!R2C1:R1000C3,3,FALSE))"
    ActiveCell.Offset(0, 1).Range("A1").Select

    ActiveCell.FormulaR1C1 = _
        "=IF(ISBLANK(RC[-3]),VLOOKUP(RC[-2],master_data!R2C2:R1000C7,6,FALSE),VLOOKUP(RC[-3],master_data!R1C1:R1000C7,7,FALSE))"

    ActiveCell.Offset(0, 1).Range("A1").Select

   'This is will immediatly prompt input box to enter quantity after the above operation

    myValue = InputBox("Enter Quantity")
    ActiveCell.Value = myValue

   'This will move cursor to the next column for calculation

    ActiveCell.Offset(0, 1).Range("A1").Select

    'This will calculate the Value of Quantity * Selling price

    myMultivalue = "=RC[-2]*RC[-1]"
    ActiveCell.Value = myMultivalue

    'This will move cursor to the next row, first column

    ActiveCell.Offset(1, -5).Range("A1").Select


End Sub

Column names snapshot

1 Ответ

1 голос
/ 03 марта 2020

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

Option Explicit
Sub EasyTool2()

    ' Product Details
    Const v1 = "VLOOKUP(RC[-1],master_data!R1C2:R1000C3,2,FALSE)"
    Const v2 = "VLOOKUP(sale!RC[-2],master_data!R2C1:R1000C3,3,FALSE)"
    ' Prices
    Const v3 = "VLOOKUP(RC[-2],master_data!R2C2:R1000C7,6,FALSE)"
    Const v4 = "VLOOKUP(RC[-3],master_data!R1C1:R1000C7,7,FALSE)"

    Dim ws As Worksheet
    Dim EAN As String, SKU As String, iRow As Long

    Set ws = ActiveSheet
    iRow = ActiveCell.Row

    If ActiveCell.Parent.Name = "master_data" Then
        MsgBox "ActiveSheet must not be master_data", vbCritical
        Exit Sub
    End If

    ' Quantity col E
    ws.Cells(iRow, 5).Value = InputBox("Enter Quantity")

    EAN = ws.Cells(iRow, 1)
    SKU = ws.Cells(iRow, 2)
    If Len(EAN) > 0 Or Len(SKU) > 0 Then
        ' product details col C
        ws.Cells(iRow, 3).FormulaR1C1 = "=IF(ISBLANK(RC[-2])," & v1 & "," & v2 & ")"
        ' selling price col D
        ws.Cells(iRow, 4).FormulaR1C1 = "=IF(ISBLANK(RC[-3])," & v3 & "," & v4 & ")"
        ' total F
        ws.Cells(iRow, 6).FormulaR1C1 = "=RC[-2]*RC[-1]"
    Else
        MsgBox "Column A and B both blank", vbCritical
        Exit Sub
    End If

    ' move to next row
    ws.Cells(iRow + 1, 1).Select

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