Vba Formula R1C1 нужна помощь - PullRequest
       3

Vba Formula R1C1 нужна помощь

0 голосов
/ 26 декабря 2018

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

Я хотел бы скопировать значения из столбцов AG, AH, AI и AJ.Я провел исследование, чтобы создать правильный код, но боролся с диапазоном и адресом (Srng.Address), а также добавил имя листа в переменную.

Srng - это путь и имя файла предыдущей книги, но .Address дает ячейку, в которой находится переменная.(У меня есть переменная книга (InstVariable), и ячейка находится в C28, но мне нужно строковое значение).Я пытался со многими неудачными попытками определить Srang, который является путем с именем Рабочего листа предыдущей рабочей книги.Рабочий лист должен быть именем текущей рабочей книги.

Вот часть моего кода ниже.Любая помощь приветствуется!

 'Current List Template
    Dim cbook As Workbook
    Set cbook = ActiveWorkbook


    'Prior List Template
    Dim pbook As Workbook
    'Workbook
   ' Set pbook = Workbooks.Open(JRDCPriorNoBrk)

    cbook.Activate


    '********************
    'Turns off screen updates (no flashes)
    '********************
    With Application
        '.Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With




    'Make sure user is on JobReq & DataChg INST tab to run macro
    Sheets("JobReq & DataChg INST").Activate


    'unshare the workbook to run macro
    'ActiveWorkbook.SaveAs ActiveWorkbook.FullName, accessmode:=xlExclusive
    Application.DisplayAlerts = False
   ' ActiveWorkbook.ExclusiveAccess


For Each xworksheet In ActiveWorkbook.Worksheets

    xworksheet.Activate

If ActiveSheet.Name = "Original" Or ActiveSheet.Name = "JobReq & DataChg INST" Then GoTo NotThisSheet

    'unprotects sheets so user can run macro
    ActiveSheet.Unprotect


    'ActiveSheet.Range("AG2").Select

    Dim Srng As Range
    Dim LastRow As Long

    'Set Srng = Worksheets("Coniguration").Range("_Configuration")
    'Set Srng = ActiveSheet.Range("AF2:AJ18")

    'pbook.Worksheet (cbook.ActiveSheet.Name)
     'LastRowp = .Cells(.Rows.Count, "AF").End(xlUp).Row


     'Set Srng = pbook.Worksheet(ActiveSheet.Name)
     'Set Srng = PathJRDCPrior.ActiveSheet.Range("AF2:AJ" & LastRowp)





    With ActiveSheet


     'With pbook.Worksheets(cbook.ActiveSheet.Name)
    'With Worksheets(" & PathJRDCPrior & ")
        'current worksheet last row
        LastRow = .Cells(.Rows.Count, "AF").End(xlUp).Row

        'prior worksheet last row
        'MsgBox (cbook.ActiveSheet.Name)
        With pbook.Worksheets(cbook.ActiveSheet.Name)
        'pbook.Worksheets (cbook.ActiveSheet.Name)
        LastRowp = .Cells(.Rows.Count, "AF").End(xlUp).Row
        SSheet = cbook.ActiveSheet.Name
        Set SPath = PathJRDCPrior

        'Set Srng = PathJRDCPrior.ActiveSheet.Range("AF2:AJ" & LastRowp)
        'Srng = pbook.Worksheets(cbook.ActiveSheet.Name).Range("AF2:AJ" & LastRowp)
        Set Srng = Worksheets(SSheet).Range("AF2:AJ" & LastRowp)
        End With
       ' MsgBox (Srng)

        With cbook.ActiveSheet.Range("AG2:AG" & LastRow)
                   With cbook.ActiveSheet.Range("AG2:AG" & LastRow)
            **.FormulaR1C1 = "=VLOOKUP(RC32," & Srng.Address(, , xlR1C1, True) & ", 2, 0)"**


            .Value = .Value
        End With
        With cbook.ActiveSheet.Range("AH2:AH" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC32," & Srng.Address(, , xlR1C1, True) & ", 3, 0)"
            .Value = .Value
        End With
        With cbook.ActiveSheet.Range("AI2:AI" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC32," & Srng.Address(, , xlR1C1, True) & ", 4, 0)"
            .Value = .Value
        End With
        With cbook.ActiveSheet.Range("AJ2:AJ" & LastRow)
            .FormulaR1C1 = "=VLOOKUP(RC32," & Srng.Address(, , xlR1C1, True) & ", 5, 0)"
            .Value = .Value
        End With
           End With

NotThisSheet:
Next xworksheet

'share workbook
ActiveWorkbook.SaveAs ActiveWorkbook.FullName, accessmode:=xlShared
Application.DisplayAlerts = True

MsgBox ("Copying from the prior list is complete.")

End Sub

1 Ответ

0 голосов
/ 27 декабря 2018

Твоему коду сложно следовать.Не обращая внимания на детали, кажется, что вы хотите:

  • Циклически перебирайте все листы (кроме двух) в cbook.
  • Для каждого просматриваемого листа вы хотите выполнитьнесколько VLOOKUP между cbook и pbook.
  • и жестко закодировать результаты VLOOKUP в виде статических значений в cbook.

Возможно, попробуйте ниже и посмотрите, как далекоты получаешь.Вам нужно будет изменить пути к файлам в коде, чтобы они соответствовали вашим собственным.

Скорее всего, мой код делает не все, что вы хотите / ваш.Также желательно, чтобы вы сделали копии вашей текущей рабочей книги и предыдущей рабочей книги и чтобы при ее запуске код ссылался на эти копии.

Option Explicit

Sub LookUpRangeInPreviousWorkbook()

    Dim currentWorkbook As Workbook
    Set currentWorkbook = Workbooks.Open("C:\Users\user\misc.xlsb") ' If you're putting your VBA code into currentWorkbook and running it from there, then you may as well just use 'Thisworkbook'

    Dim previousWorkbook As Workbook
    Set previousWorkbook = Workbooks.Open("C:\Users\user\lol.xlsb") ' JRDCPriorNoBrk is not assigned anywhere in your code, hence it's not assigned anywhere in mine.

    Dim sheetsToSkip As Variant
    sheetsToSkip = Array("Original", "JobReq & DataChg INST")

    Dim currentSheet As Worksheet ' The worksheet from the current workbook that is being looped over. Make the variable name better if possible.

    For Each currentSheet In currentWorkbook.Worksheets
        If IsError(Application.Match(currentSheet.Name, sheetsToSkip, 0)) Then

            'unprotects sheets so user can run macro
            currentSheet.Unprotect

            With previousWorkbook.Worksheets(currentSheet.Name) ' This will throw an error if the previous workbook does not contain the current sheet in the current workbook
                Dim lastRowInPreviousWorkbook As Long
                lastRowInPreviousWorkbook = .Cells(.Rows.Count, "AF").End(xlUp).Row

                Dim rangeAddressFromPreviousWorkbook As String ' This doesn't change below, so just assign it once here.
                rangeAddressFromPreviousWorkbook = .Range("AF2:AJ" & lastRowInPreviousWorkbook).Address(RowAbsolute:=True, ColumnAbsolute:=True, ReferenceStyle:=xlA1, External:=True)
            End With

            With currentSheet
                Dim lastRowInCurrentWorkbook As Long
                lastRowInCurrentWorkbook = .Cells(.Rows.Count, "AF").End(xlUp).Row

                With .Range("AG2:AG" & lastRowInCurrentWorkbook)
                    .Formula = "=VLOOKUP(AF2," & rangeAddressFromPreviousWorkbook & ", 2, 0)"
                    .Value = .Value
                End With
                With .Range("AH2:AH" & lastRowInCurrentWorkbook)
                    .Formula = "=VLOOKUP(AF2," & rangeAddressFromPreviousWorkbook & ", 3, 0)"
                    .Value = .Value
                End With
                With .Range("AI2:AI" & lastRowInCurrentWorkbook)
                    .Formula = "=VLOOKUP(AF2," & rangeAddressFromPreviousWorkbook & ", 4, 0)"
                    .Value = .Value
                End With
                With .Range("AJ2:AJ" & lastRowInCurrentWorkbook)
                    .Formula = "=VLOOKUP(AF2," & rangeAddressFromPreviousWorkbook & ", 5, 0)"
                    .Value = .Value
                End With
            End With

            ' Do you need re-protect the sheet now? Loop proceeds to next sheet in a few lines.
        End If
    Next currentSheet

    ' You might need to save either/both files -- or do something of that nature here.

    MsgBox ("Copying from the prior list is complete.")

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