根据另一个电子表格的值向电子表格添加值

时间:2017-06-23 05:43:16

标签: excel vba excel-vba

我有两本工作簿; “大师”和“z控制”。它们每个都有一个名为“Master”和“zControl”的工作表。

如果在“zControl”的列“A”和“Master”的列“M”中找到特定的短语,我需要在“Master”的列“N”中添加一个字符串。

“Master”的列“M”可能包含的信息远不仅仅是“zControl”的“A”列中的短语,因此它不是完全匹配,而是包含列“A”的值在“zControl”中按顺序排列,并用空格分隔单词。

要添加到“Master”的列“N”的字符串需要从“zControl”的列“B”中的单元格中拉出,该列与“A”列中的匹配值位于同一行中“zControl”。

我需要的简单语言示例:

如果“zControl”的“A2”与“Master”的“M44”的一部分匹配,则将“zControl”的“B2”添加到“Master”的“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

所有这一切都是将“z”的“B2”的值加到“Master”的“N2”,“zControl”的“B3”加到“Master”的“N3”等等...... / p>

任何其他想法将不胜感激。正如前面暗示的那样,我对VBA很陌生,并且正在学习。

1 个答案:

答案 0 :(得分:0)

dateB

我认为这会对你有所帮助......我还没有测试过代码。尝试一下。