【问题标题】:Copy a column from one sheet and paste as row in another using application worksheetfunciton match in vba使用 vba 中的应用程序工作表函数匹配从一张表中复制一列并粘贴为另一张表中的行
【发布时间】:2018-12-20 09:18:54
【问题描述】:

我在 Sheet1 中有这个 excel 文件:

  A       B          C                       D
Brand   Model      Type           No_of_unit_sold
A       AB123        1                       1
A       AB124        1                       2
A       AB125        1                      11
A       AB113        1                      21
A       AB127        1                      42
A       AB128        1                      12
B       BB123        1                      21
B       BB121        1                      32
AB      BB122        2                      21
AB      BB124        1                      79
AB      BB125        2                      61
AB      BB126        1                      181
B       BB127        1                      28
B       BB128        1                      132
C       CB121        1                      91
C       CB122        1                      73
C       CB123        1                      63
C       CB124        1                      52
C       CB125        1                      85
A       AB129        2                      12
C       CB126        1                      13
C       CB128        1                      94
C       CB129        1                      121

我需要 VBA 首先扫描“类型”列以查找类型 1。

然后,要查找品牌,复制品牌 A 的名称,总结已售出的单位数量并将其粘贴到 Sheet2:

 A                     B      C      D      E
Brand                  A      B      AB     C
No_of_unit_sold       89     213    260    592

为了总结价值,我可以使用带有双重标准的 sumif 函数。但是如何改变品牌名称?这不像使用带有整数的 for 循环,就像我可以为“类型”列做的那样......

另外,如何将品牌名称从 sheet1 复制到 sheet2 而不重复? 我是否使用 application.worksheetfunction.match?例如。如果在 sheet2 的单元格 (1,i) 中找不到品牌名称,请从 sheet1 复制到 sheet2?

【问题讨论】:

  • 是否可以在制作任何 vba 之前按字母顺序对带有“品牌”的列进行排序?如果重复的品牌类别相互跟随,这会变得容易得多:)

标签: excel vba worksheet-function


【解决方案1】:

以下代码适用于您。我使用了几个For 循环、If 语句和Function 来实现这一点,因为我不了解application.worksheetfunction.match。我尝试如下并为我工作!

输入表:

试试下面的代码。

Sub VBAReader()

Dim CompareBrand As String
'Dim CompareBrands() As Variant
Dim Types, units, Units_sold, ValidatedBrands As Integer
Units_sold = 0
Dim Brand As String
Dim i, j, k, l As Integer
k = 2

Types = Worksheets("Sheet1").Range("C2").End(xlDown).Row

For i = 2 To Types

'Give the type of value
If Worksheets("Sheet1").Range("C" & i).Value = 1 Then
Brand = Worksheets("Sheet1").Range("A" & i).Value

If BrandIsValidated(Brand) = False Then

For j = 2 To Types
If Worksheets("Sheet1").Range("A" & j).Value = Brand And Worksheets("Sheet1").Range("C" & j).Value = 1 Then
units = Worksheets("Sheet1").Range("D" & j).Value
Units_sold = Units_sold + units
End If
Next

Worksheets("Sheet2").Cells(1, k).Value = Brand
Worksheets("Sheet2").Cells(2, k).Value = Units_sold

Units_sold = 0
CompareBrand = Worksheets("Sheet2").Cells(1, k).Value

k = k + 1

End If

End If

Next

End Sub

Function BrandIsValidated(stringToBeFound As String) As Boolean

  ValidatedBrands = Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Column
   For l = 1 To ValidatedBrands
   If stringToBeFound = Worksheets("Sheet2").Cells(1, (l + 1)).Value Then
   BrandIsValidated = True
   Exit For
   Else
   BrandIsValidated = False

   End If
   Next

End Function

输出表:

注意:我是 VBA 新手,所以我的代码不友好。欢迎编辑:)

【讨论】:

  • 看起来很有希望。我会试试看,让你知道
  • 您好,它有效。但我也发现了一种更短的方法来仅使用 For 循环。谢谢!
  • @MT32 很高兴收到您的来信。如果我的回答符合您的问题,请接受我的回答:)
猜你喜欢
  • 2015-02-09
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2016-06-28
  • 2020-01-13
  • 2022-01-24
相关资源
最近更新 更多