2017-06-23 101 views
0

我有兩個工作簿; 「主」和「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? <如果WS_Master.Cells(i,k).Value <>「」Then>單元格(行索引,列索引)。如果你的行數已經超過了最大列數,它會拋出一個錯誤 –

回答

0
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語句中切換字符串和子字符串。一旦完成,該程序效果很好。再次感謝您的幫助!一旦你更新了答案,我會將其標記爲「已接受」。 –

相關問題