基于另一个电子表格的值将值添加到电子表格

问题描述:

我有两个工作簿; “主”和“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非常陌生,并且正在学习。

+1

尝试范围(“N”&j)。value = cells(j,3) –

+0

@Sivaprasath完成更改后,在上一行(IF语句的开始)中出现了“运行时错误'1004':”“应用程序定义或对象定义的错误”。 –

+0

你为什么通过列循环K? “”Then>单元格(行索引,列索引)。如果你的行数已经超过了最大列数,它会抛出一个错误 –

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 

我想这会帮助你...我还没有测试过代码。试试看。

+0

嗯。这仍然不起作用,但我相信这只是工作。我第一次运行它时,它没有发生任何错误,但没有在“N”中添加任何值。第二次运行时,将“Master”中的“M2”的值更改为“zControl”的“A3”的值,并将“zControl”中的“B3”的值更改为“主”。它正在进行_direct_比较而不是_partial_比较。我想知道在经过一些搜索后是否需要“Like”操作符...不知道,在这里很晚(几乎上午5点),我需要睡眠。 TY迄今为止所有的帮助! –

+0

我想通了。需要在instr语句中切换字符串和子字符串。一旦完成,该程序效果很好。再次感谢您的帮助!一旦你更新了答案,我会将其标记为“已接受”。 –