Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA中的行之间匹配来自不同列的数据_Vba_Excel - Fatal编程技术网

如何在VBA中的行之间匹配来自不同列的数据

如何在VBA中的行之间匹配来自不同列的数据,vba,excel,Vba,Excel,这是我第一次使用VBA/宏 因此,我有一个excel文件,其中订单号作为行,行号作为列,位置号作为单元格中的值 我希望设置一个当前行,然后循环其余的行,其中包含数据,以将这些行的单元格中的值与设置行中的值进行比较,然后计算匹配数。在我计算完它们之后,我想将matchcount编号放在一个新列中,然后按matchcount对整个工作表进行排序,这样我就可以获取前9行,然后将这10行(包括设置的行)移动到一个新工作表中 这就是我到目前为止所做的,它会出现各种各样的错误。语法是个大问题。我一直在用谷歌

这是我第一次使用VBA/宏 因此,我有一个excel文件,其中订单号作为行,行号作为列,位置号作为单元格中的值

我希望设置一个当前行,然后循环其余的行,其中包含数据,以将这些行的单元格中的值与设置行中的值进行比较,然后计算匹配数。在我计算完它们之后,我想将matchcount编号放在一个新列中,然后按matchcount对整个工作表进行排序,这样我就可以获取前9行,然后将这10行(包括设置的行)移动到一个新工作表中

这就是我到目前为止所做的,它会出现各种各样的错误。语法是个大问题。我一直在用谷歌搜索来找出VBA,所以语法在翻译中丢失了。我也不知道如何在循环时将一张工作表中的数据粘贴到新工作表中,以便粘贴的新数据转到下一个自由行,而不是粘贴到已粘贴的数据上

Option Explicit
Sub Workbook_Open()

 ' This routine is called when the workbook is opened.
  With Worksheets("Sheet1")
    Dim ordercount As Integer
    ordercount = ActiveWorkbook.Worksheets("Sheet1").Range("A2", Worksheets("Sheet1").Range("A2").End(xlDown)).Rows.Count
    'create matchcount column
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "Match Count"
    Columns("G:G").Select
    'create batchsheet
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets("Sheet4").Select
    Sheets("Sheet4").Name = "batches"
    Sheets("Sheet1").Select
    Range("A1:G1").Select 'copying the headers into new sheet
    Selection.Copy
    Sheets("batches").Select
    Range("A1").Select
    ActiveSheet.Paste
End With
End Sub

Sub match()
Do Until ordercount = 0
    Dim currentrow As Long
    currentrow = 2
    Dim matchrange As Range
    Set matchrange = Worksheets("sheet1").Columns("B3:F")
    Location = Range("B2:F").Cells.Value
    For Each Row In matchrange
        Dim matchcount As Integer
        matchcount = 0
        For Each cell In Row
            If currentrow.Location = Location And Location > 0 Then 'I don't want the 0's to count as matches
            matchcount = matchcount + 1
        Next
        Column("G").Row.cell.Value = matchcount
    Next
    Call sort
    Call Remove
Loop
End Sub

Sub sort()
Columns("G:G").Select
ActiveWorkbook.Worksheets("Sheet1").sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").sort.SortFields.Add Key:=Range("G1"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").sort
    .SetRange Range("G3:G")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub

Sub Remove()
Range("A2:G11").Select
Selection.Cut
Sheets("Sheet2").Select
Range("A2").Select
ActiveSheet.Paste
Sheets("Sheet1").Select
Selection.Delete Shift:=xlUp
End Sub
如有任何帮助/建议,将不胜感激。
很多都是使用记录宏来完成的

有很多地方可以通过避免
的基本方法来改进。选择
.ActiveCell
。似乎还有几个地方暗示了工作表,这些地方应该是具体的

这是对第一套动作的删减

Sub Workbook_Open()
    Dim ordercount As Integer
    ' This routine is called when the workbook is opened.
    With Worksheets("Sheet1")
        ordercount = .Range("A2", .Range("A2").End(xlDown)).Rows.Count  'what does this do?
        'create matchcount column
        .Range("G1") = "Match Count"
        'create batchsheet
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "batches"
        .Range("A1:G1").Copy Destination:=Sheets("batches").Range("A1")
    End With
End Sub
ordercount在这里似乎不起任何作用,但在另一个例程中被引用。也许这应该是一个公共变量,或者(更好)传递到第二个例程中,或者在第二个例程中定义。选择全部G列似乎没有任何作用,所以我将其完全删除

请注意,当您在a中时,所有以句点(也称为
或句号)作为前缀的内容(如
.Range
.Cells
都将其父项指定为with语句中的内容


请参阅,以了解更多关于摆脱依赖选择和激活来实现目标的方法。

请向我们展示一个示例数据,并澄清业务逻辑,好吗?谢谢和问候,我不是一个十佳的声誉,所以我不能添加截图。工作表在A列中有不同的顺序号&其余列(B-F)标记为“第1行”、“第2行”,依此类推。相应的单元格包含一个整数(6、72、9、0等),该整数与放置该行产品的位置相关。订单可以有多行的产品,因此在一个订单行中,B列可以有数字5,D列可以有数字66,其余可以是零。我的想法是,我正试图找到一种方法,根据相似的地点将10份订单批在一起。因此,位置最匹配的订单将批在一起。然后,一旦批完成,我想从那张表中删除这些订单,并将它们复制到另一张表中,这样我就可以重复这个过程,而不必对同一订单进行两次批处理。我主要关心的是匹配子程序。非常感谢。这肯定有帮助。我不知道为什么我把ordercount放在那个部分,但我把它移到了第二个子例程中。再次感谢!