在sheet B中查找sheet A中的值,然后在相应的sheet B单元格中执行函数
Look for values from sheet A in sheet B, and then do function in corresponding sheet B cell
我需要在 sheet B 中查找 sheet A 中的值,然后在 VBA 中相应的 sheet B 单元格中执行函数,以便我可以更改data in worksheet 1、按一个按钮,让它工作。字母标题表示 excel 中行的名称。 xs 只是说这是我不想操作的数据。
我有 sheet 1 和 sheet 2.
Worksheet 1
H I J K L M N
1 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 100 xxxxxxxx
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 200 xxxxxxxx
3 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 300 xxxxxxxx
4 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 400 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 500 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 600 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 700 xxxxxxxx
8 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 800 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 900 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1000 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1100 xxxxxxxx
12 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1200 xxxxxxxx
13 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1300 xxxxxxxx
14 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1400 xxxxxxxx
15 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1500 xxxxxxxx
16 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1600 xxxxxxxx
17 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1700 xxxxxxxx
18 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1800 xxxxxxxx
19 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1900 xxxxxxxx
20 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 2000 xxxxxxxx
Worksheet 2
H I J K L M N
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 25 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 40 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 35 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 50 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 65 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 90 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 10 xxxxxxxx
从而在工作中减去相应的值sheet1,从而改变M列的值。
Worksheet 1 - new
H I J K L M N
1 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 100 xxxxxxxx
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 175 xxxxxxxx
3 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 300 xxxxxxxx
4 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 400 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 460 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 510 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 690 xxxxxxxx
8 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 800 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 865 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 935 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1050 xxxxxxxx
12 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1200 xxxxxxxx
13 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1300 xxxxxxxx
14 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1400 xxxxxxxx
15 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1500 xxxxxxxx
16 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1600 xxxxxxxx
17 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1700 xxxxxxxx
18 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1800 xxxxxxxx
19 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1900 xxxxxxxx
20 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 2000 xxxxxxxx
这将对 Sheet B
上的值执行更新
Sub New2VBA()
Dim A As Worksheet, B As Worksheet
Dim i As Long, j As Long, v As Variant
Dim N As Long, M As Long
Set A = Sheets("Sheet A")
Set B = Sheets("Sheet B")
N = A.Cells(Rows.Count, "A").End(xlUp).Row
M = B.Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
v1 = A.Cells(i, "A").Value
v2 = A.Cells(i, "B").Value
For j = 1 To M
If v1 = B.Cells(j, "A").Value Then
B.Cells(j, "B").Value = B.Cells(j, "B").Value - v2
Exit For
End If
Next j
Next i
End Sub
编辑#1:
这是更新后的代码.....删除旧代码:
这将根据 sheet A (your worksheet 1) sheet B (2)
上的增量值
Sub New2VBA()
Dim A As Worksheet, B As Worksheet
Dim i As Long, j As Long, v As Variant
Dim N As Long, M As Long
Set A = Sheets("Sheet A")
Set B = Sheets("Sheet B")
'
' A is worksheet 1
' B is worksheet 2
'
N = A.Cells(Rows.Count, "H").End(xlUp).Row
M = B.Cells(Rows.Count, "H").End(xlUp).Row
For i = 1 To M
v1 = B.Cells(i, "H").Value
v2 = B.Cells(i, "M").Value
For j = 1 To N
If v1 = A.Cells(j, "H").Value Then
A.Cells(j, "M").Value = A.Cells(j, "M").Value - v2
Exit For
End If
Next j
Next i
End Sub
感谢 Gary 的学生的回答,这是主题的变体,它 (a) 使用 Range.Find
方法查找帐户,(b) 允许您设置列(和其他设置参数) ) 按照您的要求。因此,设置各种参数以适合您的场景。请注意,我的两组测试数据都定位于从 A1 开始,并且 Company/Expense/Account 是并排的。 Offset
的 1.
Option Explicit
Sub subExp()
Dim wsExp As Worksheet, wsAcc As Worksheet
Dim accRng As Range, fndCo As Range, c As Range
Dim expStRow As Long, expEndRow As Long, expCoCol As Long, expExpColOffset As Long
Dim accStRow As Long, accEndRow As Long, accCoCol As Long, accAcColOffset As Long
'Assign worksheets
Set wsExp = Worksheets("Expenses")
Set wsAcc = Worksheets("Accounts")
'Assign data start position on each sheet
expStRow = 2
expCoCol = 1
expExpColOffset = 1
accStRow = 2
accCoCol = 1
accAcColOffset = 1
With wsAcc
accEndRow = .Cells(Rows.Count, accCoCol).End(xlUp).Row
Set accRng = .Range(.Cells(accStRow, accCoCol), .Cells(accEndRow, accCoCol).Offset(0, accAcColOffset))
End With
With wsExp
expEndRow = .Cells(Rows.Count, expCoCol).End(xlUp).Row
Set expRng = .Range(.Cells(expStRow, expCoCol), .Cells(expEndRow, expCoCol))
For Each c In expRng
Set fndCo = accRng.Find(What:=c, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not fndCo Is Nothing Then
fndCo.Offset(0, accAcColOffset).Value = fndCo.Offset(0, accAcColOffset).Value - c.Offset(0, expExpColOffset).Value
End If
Next c
End With
End Sub
作为避免循环的替代方法:
Sub tgr()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rngH1 As Range, rngM1 As Range
Dim rngH2 As Range, rngM2 As Range
Dim arrResults As Variant
Set ws1 = ActiveWorkbook.Sheets("Sheet1")
Set rngH1 = ws1.Range("H2", ws1.Cells(Rows.Count, "H").End(xlUp))
Set rngM1 = Intersect(rngH1.EntireRow, ws1.Columns("M"))
Set ws2 = ActiveWorkbook.Sheets("Sheet2")
Set rngH2 = ws2.Range("H2", ws2.Cells(Rows.Count, "H").End(xlUp))
Set rngM2 = Intersect(rngH2.EntireRow, ws2.Columns("M"))
arrResults = Evaluate("=INDEX(" & rngM1.Address(External:=True) & "-SUMIF(" & rngH2.Address(External:=True) & "," & rngH1.Address(External:=True) & "," & rngM2.Address(External:=True) & "),)")
rngM1.Value = arrResults
End Sub
我需要在 sheet B 中查找 sheet A 中的值,然后在 VBA 中相应的 sheet B 单元格中执行函数,以便我可以更改data in worksheet 1、按一个按钮,让它工作。字母标题表示 excel 中行的名称。 xs 只是说这是我不想操作的数据。 我有 sheet 1 和 sheet 2.
Worksheet 1
H I J K L M N
1 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 100 xxxxxxxx
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 200 xxxxxxxx
3 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 300 xxxxxxxx
4 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 400 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 500 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 600 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 700 xxxxxxxx
8 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 800 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 900 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1000 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1100 xxxxxxxx
12 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1200 xxxxxxxx
13 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1300 xxxxxxxx
14 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1400 xxxxxxxx
15 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1500 xxxxxxxx
16 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1600 xxxxxxxx
17 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1700 xxxxxxxx
18 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1800 xxxxxxxx
19 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1900 xxxxxxxx
20 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 2000 xxxxxxxx
Worksheet 2
H I J K L M N
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 25 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 40 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 35 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 50 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 65 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 90 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 10 xxxxxxxx
从而在工作中减去相应的值sheet1,从而改变M列的值。
Worksheet 1 - new
H I J K L M N
1 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 100 xxxxxxxx
2 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 175 xxxxxxxx
3 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 300 xxxxxxxx
4 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 400 xxxxxxxx
5 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 460 xxxxxxxx
6 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 510 xxxxxxxx
7 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 690 xxxxxxxx
8 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 800 xxxxxxxx
9 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 865 xxxxxxxx
10 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 935 xxxxxxxx
11 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1050 xxxxxxxx
12 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1200 xxxxxxxx
13 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1300 xxxxxxxx
14 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1400 xxxxxxxx
15 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1500 xxxxxxxx
16 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1600 xxxxxxxx
17 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1700 xxxxxxxx
18 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1800 xxxxxxxx
19 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 1900 xxxxxxxx
20 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 2000 xxxxxxxx
这将对 Sheet B
上的值执行更新Sub New2VBA()
Dim A As Worksheet, B As Worksheet
Dim i As Long, j As Long, v As Variant
Dim N As Long, M As Long
Set A = Sheets("Sheet A")
Set B = Sheets("Sheet B")
N = A.Cells(Rows.Count, "A").End(xlUp).Row
M = B.Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
v1 = A.Cells(i, "A").Value
v2 = A.Cells(i, "B").Value
For j = 1 To M
If v1 = B.Cells(j, "A").Value Then
B.Cells(j, "B").Value = B.Cells(j, "B").Value - v2
Exit For
End If
Next j
Next i
End Sub
编辑#1:
这是更新后的代码.....删除旧代码:
这将根据 sheet A (your worksheet 1) sheet B (2)
上的增量值Sub New2VBA()
Dim A As Worksheet, B As Worksheet
Dim i As Long, j As Long, v As Variant
Dim N As Long, M As Long
Set A = Sheets("Sheet A")
Set B = Sheets("Sheet B")
'
' A is worksheet 1
' B is worksheet 2
'
N = A.Cells(Rows.Count, "H").End(xlUp).Row
M = B.Cells(Rows.Count, "H").End(xlUp).Row
For i = 1 To M
v1 = B.Cells(i, "H").Value
v2 = B.Cells(i, "M").Value
For j = 1 To N
If v1 = A.Cells(j, "H").Value Then
A.Cells(j, "M").Value = A.Cells(j, "M").Value - v2
Exit For
End If
Next j
Next i
End Sub
感谢 Gary 的学生的回答,这是主题的变体,它 (a) 使用 Range.Find
方法查找帐户,(b) 允许您设置列(和其他设置参数) ) 按照您的要求。因此,设置各种参数以适合您的场景。请注意,我的两组测试数据都定位于从 A1 开始,并且 Company/Expense/Account 是并排的。 Offset
的 1.
Option Explicit
Sub subExp()
Dim wsExp As Worksheet, wsAcc As Worksheet
Dim accRng As Range, fndCo As Range, c As Range
Dim expStRow As Long, expEndRow As Long, expCoCol As Long, expExpColOffset As Long
Dim accStRow As Long, accEndRow As Long, accCoCol As Long, accAcColOffset As Long
'Assign worksheets
Set wsExp = Worksheets("Expenses")
Set wsAcc = Worksheets("Accounts")
'Assign data start position on each sheet
expStRow = 2
expCoCol = 1
expExpColOffset = 1
accStRow = 2
accCoCol = 1
accAcColOffset = 1
With wsAcc
accEndRow = .Cells(Rows.Count, accCoCol).End(xlUp).Row
Set accRng = .Range(.Cells(accStRow, accCoCol), .Cells(accEndRow, accCoCol).Offset(0, accAcColOffset))
End With
With wsExp
expEndRow = .Cells(Rows.Count, expCoCol).End(xlUp).Row
Set expRng = .Range(.Cells(expStRow, expCoCol), .Cells(expEndRow, expCoCol))
For Each c In expRng
Set fndCo = accRng.Find(What:=c, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not fndCo Is Nothing Then
fndCo.Offset(0, accAcColOffset).Value = fndCo.Offset(0, accAcColOffset).Value - c.Offset(0, expExpColOffset).Value
End If
Next c
End With
End Sub
作为避免循环的替代方法:
Sub tgr()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rngH1 As Range, rngM1 As Range
Dim rngH2 As Range, rngM2 As Range
Dim arrResults As Variant
Set ws1 = ActiveWorkbook.Sheets("Sheet1")
Set rngH1 = ws1.Range("H2", ws1.Cells(Rows.Count, "H").End(xlUp))
Set rngM1 = Intersect(rngH1.EntireRow, ws1.Columns("M"))
Set ws2 = ActiveWorkbook.Sheets("Sheet2")
Set rngH2 = ws2.Range("H2", ws2.Cells(Rows.Count, "H").End(xlUp))
Set rngM2 = Intersect(rngH2.EntireRow, ws2.Columns("M"))
arrResults = Evaluate("=INDEX(" & rngM1.Address(External:=True) & "-SUMIF(" & rngH2.Address(External:=True) & "," & rngH1.Address(External:=True) & "," & rngM2.Address(External:=True) & "),)")
rngM1.Value = arrResults
End Sub