2012-09-20 132 views
0

我试图获得一个VBA编码,它将搜索格式化为日期的单元格以及所有日期格式,再次搜索它上面的特定文本并将其复制到其中的行日期单元格是。Excel 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 

任何帮助,将不胜感激!

+0

哇,我的示例数据没有复制好。列A和B是空白的。 C列有文本“客户账户”,客户账号,“日期”,然后是五个日期(C1:C8)。我希望对于五个日期中的每一个日期,代码都会搜索上面的文本“客户账户”,并为五个日期中的每一个返回适用的客户账户号码。希望这个澄清有助于。 – user1686737

+0

也许添加一个屏幕截图? – JMK

+1

只需注意:您的示例数据中的日期是m/d/y格式,但是您的代码会测试d/m/y格式。在我的答案中,我不测试格式,但不是因为这个原因。 –

回答

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