【问题标题】:Selecting Cells Based on Criteria, then Copy and Paste Special (Transpose) - Macro Help根据条件选择单元格,然后选择性复制和粘贴(转置) - 宏帮助
【发布时间】:2011-05-12 16:23:36
【问题描述】:

我想知道是否有人可以帮助我解决以下问题。我有两个excel工作簿。工作簿 A 包含从 1 到 1000 的帐单数据。每个帐单按数字顺序位于不同的行上。工作簿 B 包含账单发起人信息。但是,它被格式化为每行 1 个赞助商,因此 1 个账单可以占据多行。此外,账单编号在 A 列,而赞助商名称在 B 列。因此,您必须根据 A 列中的值从 B 列中选择名称。

我想从工作簿 B 中为每个法案选择每个赞助商的名称,并将它们特殊(转置)粘贴到每个法案的工作簿 A 中。我可以手动完成,但需要很长时间。反正有自动化吗?提前谢谢你。

数据是这样的

工作簿 A
A栏
1
2
3
4
5

工作簿 B
A 列 B 列
1 姓名ID
1 姓名ID
2 姓名ID
2 姓名ID
2 姓名ID
2 姓名ID

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    一种可能的解决方案是使用用户定义的公式,当用作数组公式时,将为每个账单 ID 返回一个以逗号分隔的账单发起人列表。我之前发布了 UDF 的代码 here。在 VBA 模块中输入代码后,在工作簿 A 的 B2 中输入以下公式:

    =CCARRAY(IF(A2=[Workbook_B]Sheet_Name!$A$2:$A$2000,[Book2]Sheet_Name!$B$2:$B$2000),", ")
    

    按 Ctrl+Shift+Enter 将公式作为数组公式输入。然后填写所有账单 ID。

    为了清楚起见,您需要插入适当的文件和工作表名称,并调整行数以匹配您的数据。此外,由于数组公式在计算上可能有点笨拙,因此您可能需要复制 B 列并将特殊的“仅值”粘贴回 B 列。

    【讨论】:

      【解决方案2】:

      未经测试...

      Sub Tester()
      
      Dim Bills As Excel.Worksheet
      Dim Sponsors As Excel.Worksheet
      Dim c As Range, f As Range
      
          Set Bills = Workbooks("WorkbookA").Sheets("Bills")
          Set Sponsors = Workbooks("WorkbookB").Sheets("Sponsors")
      
          Set c = Sponsors.Range("A2")
          Do While c.Value <> ""
              Set f = Bills.Range("A:A").Find(c.Value, , xlValues, xlWhole)
              If Not f Is Nothing Then
                  Bills.Cells(f.Row, Bills.Columns.Count).End(xlToLeft).Offset(0, 1).Value = c.Offset(0, 1).Value
              Else
                  c.Font.Color = vbRed
              End If
              Set c = c.Offset(1, 0)
          Loop
      End Sub
      

      【讨论】:

        【解决方案3】:

        这是一个可以解决问题的宏。

        它在内存变量数组中工作以提供合理的速度。循环单元格/行会产生更简单的代码,但运行速度会慢得多。

        它要求(并测试)所有 BillID 都存在于赞助商列表中

        此外,它使用 , 分隔赞助商列表,因此 , 不得出现在任何赞助商名称中。如果是选择不同的字符 .

        Sub GetSponsors()
            Dim rngSponsors As Range, rngBills As Range
            Dim vSrc As Variant
            Dim vDst() As Variant
            Dim i As Long, j As Long
        
            ' Assumes data starts at cell A2 and extends down with no empty cells
            Set rngSponsors = Sheets("Sponsors").[A2]
            Set rngSponsors = Range(rngSponsors, rngSponsors.End(xlDown))
        
            ' Count unique values in column A
            j = Application.Evaluate("SUM(IF(FREQUENCY(" _
                & rngSponsors.Address & "," & rngSponsors.Address & ")>0,1))")
            ReDim vDst(1 To j, 1 To 2)
            j = 1
        
            ' Get original data into an array
            vSrc = rngSponsors.Resize(, 2)
        
            ' Create new array, one row for each unique value in column A
            vDst(1, 1) = vSrc(1, 1)
            vDst(1, 2) = "'" & vSrc(1, 2)
            For i = 2 To UBound(vSrc, 1)
                If vSrc(i - 1, 1) = vSrc(i, 1) Then
                    vDst(j, 2) = vDst(j, 2) & "," & vSrc(i, 2)
                Else
                    j = j + 1
                    vDst(j, 1) = vSrc(i, 1)
                    vDst(j, 2) = "'" & vSrc(i, 2)
                End If
        
            Next
        
            Set rngBills = Sheets("Bills").[A2]
            Set rngBills = Range(rngBills, rngBills.End(xlDown))
        
            ' check if either list has missing Bill numbers
            If UBound(vDst, 1) = rngBills.Rows.Count Then
                ' Put new data in sheet
                rngBills.Resize(, 2) = vDst
                rngBills.Columns(2).TextToColumns , _
                    Destination:=rngBills.Cells(1, 2), _
                    DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, _
                    ConsecutiveDelimiter:=False, _
                    Tab:=False, _
                    Semicolon:=False, _
                    Comma:=True, _
                    Space:=False, _
                    Other:=False
        
            ElseIf UBound(vDst, 1) < rngBills.Rows.Count Then
                MsgBox "Missing Bills in Sponsors list"
            Else
                MsgBox "Missing Bills in Bills list"
            End If
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-03
          • 1970-01-01
          相关资源
          最近更新 更多