2012-06-15 74 views
1

因此,我必须创建一个宏,它可以运行一个报表并获取具有相同发票号的所有记录,并将其与日期放在一行中,它被卖给相同发票号码的延长定价的所有行的总和,如果适用的话,定单运费以及延期定价和定单运费的总和。Microsoft Excel宏更改单元格的值当运行

它会把这些值,并把它们放到一个新的工作表。

这是我遇到问题的地方。大多数情况下,它似乎是宏观的工作,但一旦它达到某个记录,它实际上将数字的发票(即(123456))更改为下一行(即123457)。因此,发票是123456不再现有的,而是与123457分组在一起。

我穿过它,应该没有任何理由改变价值,因为它没有做任何其他细胞。有没有人有理由知道为什么这样做?

这是我的代码。提前致谢。

Sub CombineInvoice() 

    Dim InvoiceNum As String, InvoiceDate As String, SoldToAcct As String 
    Dim ExtPrice As Double, OrderFreight As Double, OrderTotal As Double 
    Dim WS2 As Worksheet 

    Application.ScreenUpdating = False 

    Set WS2 = Sheets.Add 

    With Sheet1.Range("A1,C1,D1,BB1,BD1") 
     .Copy Destination:=Sheet2.Range("A1:F1") 
    End With 

    Sheet1.Select 

    InvoiceNum = Range("A2").Value 
    InvoiceDate = Range("C2").Value 
    SoldToAcct = Range("D2").Value 

    Sheet2.Select 
    Selection.Offset(0, 5).Value = "Order Total" 
    Range("A2").Select 
    Sheet1.Select 
    Range("A2").Select 

    Do 
     'Set order freight 
     OrderFreight = OrderFreight + Selection.Offset(0, 55) 
     'Set invoice date 
     InvoiceDate = Selection.Offset(0, 2) 
     'Set Sold to account 
     SoldToAcct = Selection.Offset(0, 3) 
     'Get extended price 
     Do Until Selection.Value <> InvoiceNum 
      ExtPrice = ExtPrice + Selection.Offset(0, 53) 
      'Make sure orderFreight is the same 
      If (OrderFreight <> OrderFreight Or OrderFreight = 0) Then 
       OrderFreight = OrderFreight + Selection.Offset(0, 55) 
      Else 
       OrderFreight = OrderFreight 
      End If 

      Selection.Offset(1, 0).Select 
     Loop 
     'Add Extended Price to Order Freight 
     OrderTotal = ExtPrice + OrderFreight 
     'Populate Sheet 2 with data 
     Sheet2.Select 
     With Selection 
      .Value = InvoiceNum 
      .Offset(0, 1).Value = InvoiceDate 
      .Offset(0, 2).Value = SoldToAcct 
      .Offset(0, 3).Value = ExtPrice 
      .Offset(0, 4).Value = OrderFreight 
      .Offset(0, 5).Value = OrderTotal 
      .Offset(1, 0).Select 
     End With 
     'Return to sheet 1 for next invoice number 
     Sheet1.Select 
     Selection.Value = Selection.Offset(1, 0) 
     InvoiceNum = Selection.Value 
     ExtPrice = 0 
     OrderFreight = 0 
     If (Selection.Value = "") Then Exit Do 

    Loop 

    Application.ScreenUpdating = True 

    End Sub 
+0

我刚刚给了这些例子。但他们同样是连续的。 – lessthanthree

+2

两件事。 1)使用选择是VBA是一个100%的坏主意! (除非绝对必要,或者用于调试)。你指的是范围或单元格要好得多。 2)如果没有实际的数据和所有的选择参考,很难进行测试,但是如果将“Selection.Value = Selection.Offset(1,0)| InvoiceNum = Selection.Value”行更改为“InvoiceNum = Selection.Offset 1)“,这是否解决它。 –

+1

啊。我想到了@阿兰,我有一个不必要的结论。我注释了SelectionValue = Selection.Offset(1,0),它运行得很好。不过谢谢你对我的问题的兴趣! – lessthanthree

回答

0

附近的第一/外循环的结尾,我们有这些行的代码:

Sheet1.Select 
Selection.Value = Selection.Offset(1, 0) 
InvoiceNum = Selection.Value 
ExtPrice = 0 
OrderFreight = 0 
If (Selection.Value = "") Then Exit Do 

在注释中表示的OP,移除该行工作:

Selection.Value = Selection.Offset(1, 0) 

然而,因为Selection.Value用于下一行,所以我建议对下一行进行以下更改(这也是@ Scott在注释中提到的)。

InvoiceNum = Selection.Offset(1, 0).Value 
相关问题