0

我正在尝试获得一个 VBA 编码,它将搜索格式化为日期的单元格,对于所有日期格式,再次搜索其上方的特定文本并将其复制到日期单元格所在的行。

为了说明,下面是我试图解决的数据示例。对于 C 列中格式化为日期的任何单元格,我希望代码找到客户编号(单元格 C2)和客户名称(D2)并复制到适用行的 A 列和 B 列。问题出现是因为我的数据中的许多客户都拥有不止一张优惠券,因此我无法将其硬编码为简单地位于具有日期的单元格上方的两行。我希望我说得通!

Customer account Name
1001010 Internal : Sales Admin (9900) 
Date         Voucher
12/7/2011    CINV00000980
1/26/2012    CINV00001011
2/9/2012     CINV00001050
3/6/2012     CINV00002003
3/13/2012    CINV00002067

我现在正在尝试使用嵌套的 Do 循环(见下文),显然它不起作用。代码正在运行,但没有发生复制/粘贴。

Sub ARAging() 
   Dim row As Integer
    row = 2
    finalrow = ActiveSheet.UsedRange.Rows.Count
Do

    If Range(Cells(row, 3), Cells(row, 3)).NumberFormat = "dd/mm/yyyy" Then
        Do
        If Range(Cells(row, 3), Cells(row, 3)).Value = "Customer account" Then
        Range(Cells(row - 1, 3), Cells(row - 1, 4)).Select
            With Selection.Copy
            End With
        End If
        row = row - 1
        Loop Until Range(Cells(row, 3), Cells(row, 3)).Value = "Customer account"

        Range(Cells(row, 1), Cells(row, 2)).Select
            With Selection.Paste
            End With
    End If

row = row + 1

Loop Until row = finalrow
End Sub

任何帮助,将不胜感激!

4

1 回答 1

2

我认为这段代码可以满足您的要求。我希望我已经包含了足够的注释来解释我的代码。如有必要,请回来提出问题。

' Option Explicit means every variable must be explicitly declared.  Without
' it a misspelt variable name becomes an implicit declaration.  This can be
' a very difficult error to find.
Option Explicit

Sub ARAging()

  ' On a 32-bit system, the native size is what Excel calls Long.  So integer
  ' variables are slower than long variables.

  ' My style is to start a variable name with its type and then add classifiers
  ' to identify its purpose.  This means that when I return to this macro in
  ' six or twelve months, I know what the variables are.  If you do not like my
  ' style, develop your own or develop one with colleagues.  Consistent names
  ' are a godsend during maintenence.
  Dim acctNumCust As String
  Dim rowCrnt As Long
  Dim rowFinal As Long

  With Worksheets("Sheet1")
    ' I avoid ActiveSheet unless I want the user to be able to run the macro
    ' against a worksheet of their choice.

    acctNumCust = ""
    rowFinal = .UsedRange.Rows.Count
    For rowCrnt = 2 To rowFinal

        ' In .Cells(R,C), C can be a number or a column code.
        ' If I am accessing a single cell, I do not need to make it into
        ' a range since .Cells(R,C) is a range.

      If .Cells(rowCrnt, "C").Value = "Customer account" Then

        ' Since I know column C is "Customer account", I do not need to
        ' save it.  Save the value of column 4 in a variable not the
        ' scratchpad.
        acctNumCust = .Cells(rowCrnt, "D").Value

        ' I do not like testing for the formatting.  What if the user changes
        ' it to dd-mmm-yy?

      ElseIf IsDate(.Cells(rowCrnt, "C").Value) Then
        .Cells(rowCrnt, "A").Value = "Customer account"
        .Cells(rowCrnt, "B").Value = acctNumCust

      Else

        Call MsgBox("Cell C" & rowCrnt & " is neither """ & _
                                    "Customer account"" nor a date", vbOKOnly)

      End If

    Next rowCrnt

  End With  ' Worksheets("Sheet1")

End Sub
于 2012-09-20T20:25:45.177 回答