Это мой первый пост. Я новичок в VBA и многому учусь благодаря этому форуму. Я пытаюсь создать макрос Excel, который сравнивает два набора данных с помощью Vlookup.
Этот макрос доступен через панель инструментов, поэтому это означает, что пользователь может получить к нему доступ с любого листа или рабочей книги.
Два данных, которые мне нужно сравнить, могут быть на любом листе (это означает, что они должны быть переменными). Предположим, что в этом примере это Sheet1 и sheet 6.
Sheet1 (Пример - но должен быть переменным, так как пользователь выберет это)
Account Description Amount
100 Account1 1000
200 Account2 2000
300 Account3 3000
Sheet6 (Пример - Но нужныбыть переменным, так как пользователь выберет это)
Account Description Amount
200 Account2 500
300 Account3 1000
400 Account4 4000
Проблема в том, чтобы поднять лист. Я использую inputbox.application, чтобы позволить пользователю выбрать лист и данные. Код, который я использую, только выбирает диапазон, например, для A1: C3, но не выбирает листы. В этом случае это должен был быть sheet1 и sheet6
В данный момент я получаю этот вывод = IFNA (VLOOKUP (A2, $ A $ 1: $ C $ 3,3, FALSE), «Новая учетная запись»)
Так и должно быть. т.е. он должен включать имя листа из диапазона PYTBRange.Address = IFNA (VLOOKUP (A2, Sheet6! $ A $ 1: $ C $ 3,3, FALSE), «Новая учетная запись»)
Thisэто код, который создает проблемы: -
Range(Cells(CYFirstRow, CYLastColomn + 1), Cells(CYFinalrow, CYLastColomn + 1)).Formula = "=Ifna(Vlookup(" & Cells(CYFirstRow, CYFirstColomn).Address(False, False) & "," & PYTBRange.Address(True, True) & "," & AmountColomn & ",false),""New Account"")"
PYTBRange.Address (True, True) - Этот бит Специально, поскольку это должно выбрать Sheet6 как полный адрес
У меня естьпопытался добавить
Dim Ws As Worksheet
Dim Olddata as Range
Set Ws = PYTBRange.Worksheet
Set Olddata = Ws.Name.PYTBRange.Address(True, True)
Range(Cells(CYFirstRow, CYLastColomn + 1), Cells(CYFinalrow, CYLastColomn + 1)).Formula = "=Ifna(Vlookup(" & Cells(CYFirstRow, CYFirstColomn).Address(False, False) & "," & Olddata & "," & AmountColomn & ",false),""New Account"")"
Но это дает мне ошибку
Полный код без исправления
Sub Comparetb()
Dim CYTBRange As Range
Dim PYTBRange As Range
Dim AmountColomn As Integer
Dim CYFirstRow As Long
Dim CYFinalrow As Long
Dim CYLastColomn As Long
Dim CYFirstColomn As Long
On Error Resume Next
Set CYTBRange = Application.Inputbox("Please select Current year TB", Type:=8)
' This is for Current year data
If TypeName(CYTBRange) = "Empty" Then
Exit Sub
End If
Set PYTBRange = Application.Inputbox("Please select the TB which you want to compare", Type:=8)
' This is for previous year data
If TypeName(PYTBRange) = "Empty" Then
Exit Sub
End If
AmountColomn = Application.Inputbox("Please enter the colomn in which the Amount is Previous year TB", Type:=1, Default:=3)
' This ask for the colomn number for vlookup
If TypeName(PYTBRange) = "Empty" Then
Exit Sub
End If
'This helps in finding the first row/colum and Last row/colomn
CYFirstRow = CYTBRange.Row
CYFinalrow = Cells(CYFirstRow, CYTBRange.Column).End(xlDown).Row
CYLastColomn = Cells(CYFinalrow, CYTBRange.Column).End(xlToRight).Column
CYFirstColomn = CYTBRange.Column
' Inserts 2 colomns to the right
Range(Cells(CYFirstRow, CYLastColomn + 1), Cells(CYFinalrow, CYLastColomn + 2)).EntireColumn.Insert
' Vlookup - Part where the problems lies
Range(Cells(CYFirstRow, CYLastColomn + 1), Cells(CYFinalrow, CYLastColomn + 1)).Formula = "=Ifna(Vlookup(" & Cells(CYFirstRow, CYFirstColomn).Address(False, False) & "," & PYTBRange.Address(True, True) & "," & AmountColomn & ",false),""New Account"")"
End Sub
Я ожидаю, что конечный результат должен быть = IFNA (VLOOKUP (A2,Sheet6! $ A $ 1: $ C $ 3,3, FALSE), «Новая учетная запись»), т. Е. Она берет имя листа
Также в случае, если пользователь получает выходные данные из другой рабочей книги, есть ли способпозаботиться об этом тоже?