基于另一个电子表格的值将值添加到电子表格
我有两个工作簿; “主”和“zControl”。它们分别有一个名为“Master”和“zControl”的工作表。基于另一个电子表格的值将值添加到电子表格
如果在“zControl”的“A”列和“Master”的“M”列中找到特定的短语,我需要向“Master”的列“N”添加一个字符串。
“Master”的列“M”可能包含比“zControl”的列“A”中的短语更多的信息,因此它不会完全匹配,但将包含列“A “在”zControl“中按顺序排列,并用空格分隔单词。
要添加到“Master”列“N”的字符串需要从“zControl”的列“B”的单元格中拉出,该列与“A”列中的匹配值位于同一行中的“zControl”。
的什么,我需要用通俗易懂的语言例子:
如果“zControl”的“A2”相匹配的“大师”,“M44”的一部分,然后添加“zControl”的“B2”为“N44”的“主”。
查找下一个匹配,并执行相同的逻辑......
的什么,我需要宏观通俗易懂的语言做又如:
如果“zControl”的“A49”匹配“的一部分“Master”的“M2”,然后将“zControl”的“B49”添加到“Master”的“N2”中。
查找下一个匹配,并执行相同的逻辑......
这是我到目前为止有:
Sub Adder()
Dim WS_Master As Worksheet
Dim WS_Control As Worksheet
Dim WS_Master_Lastrow As Long
Dim WS_Control_Lastrow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Set WS_Master = Workbooks("Master").Worksheets("Master")
Set WS_Control = Workbooks("zControl").Worksheets("zControl")
'Find last row of WS_Master
WS_Master_Lastrow = WS_Master.Cells.Find("*", [A1], , , xlByRows,
xlPrevious).Row
'find last column of WS_Master
WS_Master_Lastcol = WS_Master.Cells.Find("*", [A1], , , xlByColumns,
xlPrevious).Column
'Find last row of WS_Control
WS_Control_Lastrow = WS_Control.Cells.Find("*", [A1], , , xlByRows,
xlPrevious).Row
'Add control sheet data to a array
Dim ControlData() As String
ReDim ControlData(1 To WS_Control_Lastrow, 1 To 3)
For i = 1 To WS_Control_Lastrow
ControlData(i, 1) = Trim(WS_Control.Range("A" & i).Value)
ControlData(i, 2) = Trim(WS_Master.Range("M" & i).Value)
ControlData(i, 3) = Trim(WS_Control.Range("B" & i).Value)
Next i
'Loop through Master sheet
For i = 1 To WS_Master_Lastrow
'Loop through Control sheet
For j = 2 To WS_Control_Lastrow
'if both string found
If InStr(1, WS_Control.Range("A" & i).Value, ControlData(j, 1),
vbTextCompare) > 0 And _
InStr(1, WS_Master.Range("M" & i).Value, ControlData(j, 2),
vbTextCompare) > 0 Then
'Add Save Value to the row
For k = 1 To WS_Master_Lastrow
If WS_Master.Cells(i, j).Value <> "" Then
WS_Master.Range("N" & j).Value = WS_Control.Cells(i, 2)
End If
Next k
Exit For
End If
Next j
Next i
MsgBox "Completed!", vbInformation, ""
End Sub
在这一点上,我收到的IF语句挂了。我几乎可以肯定,错误的原因是“.Range”参数,但无法弄清楚如何修复它,以便宏将必要的值添加到列“N”中正确的单元格。
这是我在VBA中做的最复杂的事情,也是我第一次使用数组。我提到的原因是,即使没有这个错误,我可能不会做我想做的事情。
任何想法或方向将不胜感激。
感谢您花时间阅读本文,并且如果能够的话,请提供您的意见。
编辑:
这是我现在在哪里。
Sub Adder()
Dim WS_Master As Worksheet 'This was GNC
Dim WS_Control As Worksheet 'This was the ControlSheet.
Dim WS_Master_Lastrow As Long
Dim WS_Control_Lastrow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Set WS_Master = Workbooks("Master").Worksheets("Master")
Set WS_Control = Workbooks("zControl").Worksheets("zControl")
'Find last row of WS_Master
WS_Master_Lastrow = WS_Master.Cells.Find("*", [A1], , , xlByRows,
xlPrevious).Row
'find last column of WS_Master
WS_Master_Lastcol = WS_Master.Cells.Find("*", [A1], , , xlByColumns,
xlPrevious).Column
'Find last row of WS_Control
WS_Control_Lastrow = WS_Control.Cells.Find("*", [A1], , , xlByRows,
xlPrevious).Row
'Add control sheet data to a array
Dim ControlData() As String
ReDim ControlData(1 To WS_Control_Lastrow, 1 To 3)
For i = 1 To WS_Control_Lastrow
ControlData(i, 1) = Trim(WS_Control.Range("A" & i).Value)
ControlData(i, 2) = Trim(WS_Master.Range("M" & i).Value)
ControlData(i, 3) = Trim(WS_Control.Range("B" & i).Value)
Next i
'Loop through data sheet
For i = 1 To WS_Master_Lastrow
'Loop through control sheet
For j = 2 To WS_Control_Lastrow
'if both string found
If InStr(1, WS_Control.Range("A" & i).Value, ControlData(j, 1),
vbTextCompare) > 0 And _
InStr(1, WS_Master.Range("M" & i).Value, ControlData(j, 2),
vbTextCompare) > 0 Then
'Add Save Value to the row
WS_Master.Range("N" & j).Value = WS_Control.Cells(i, 2)
End If
Next j
Next i
MsgBox "Completed!", vbInformation, ""
End Sub
所有这一切都做的是“B2”从“zControl”的值增加的“主”,“zControl”的“主”,“N2”,“B3”为“N3”等...
任何其他想法将不胜感激。正如之前所暗示的,我对VBA非常陌生,并且正在学习。
sub adder()
dim zcontrol as worksheet
dim wsmaster as worksheet
application.screenupdating=false
application.displayalerts=false
On error goto Reset_settings
Set wsmaster = Workbooks("Master").Worksheets("Master")
Set zcontrol = Workbooks("zControl").Worksheets("zControl")
zcontrol_lr=zcontrol.range("A" & rows.count).end(xlup).row
wsmaster_lr=wsmaster.range("A" & rows.count).end(xlup).row
wsmaster_lc=wsmaster.cells(1,columns.count).end(xltoleft).column
For i=2 to wsmaster_lr
for j=2 to zcontrol_lr
if instr(1,Trim(wsmaster.range("M" & i).value), trim(zcontrol.range("A"& j).value),vbBinaryCompare) > 0 then
wsmaster.range("N"& i).value=zcontrol.cells(j,2).value
end if
next j
next i
Msgbox "Completed!",vbinfomration,""
reset_settings:
application.screenupdating=true
application.displayalerts=true
end sub
我想这会帮助你...我还没有测试过代码。试试看。
嗯。这仍然不起作用,但我相信这只是工作。我第一次运行它时,它没有发生任何错误,但没有在“N”中添加任何值。第二次运行时,将“Master”中的“M2”的值更改为“zControl”的“A3”的值,并将“zControl”中的“B3”的值更改为“主”。它正在进行_direct_比较而不是_partial_比较。我想知道在经过一些搜索后是否需要“Like”操作符...不知道,在这里很晚(几乎上午5点),我需要睡眠。 TY迄今为止所有的帮助! –
我想通了。需要在instr语句中切换字符串和子字符串。一旦完成,该程序效果很好。再次感谢您的帮助!一旦你更新了答案,我会将其标记为“已接受”。 –
尝试范围(“N”&j)。value = cells(j,3) –
@Sivaprasath完成更改后,在上一行(IF语句的开始)中出现了“运行时错误'1004':”“应用程序定义或对象定义的错误”。 –
你为什么通过列循环K? “”Then>单元格(行索引,列索引)。如果你的行数已经超过了最大列数,它会抛出一个错误 –