2015-08-28 48 views
1

我是VBA的新手,想要了解它並讓我的文件正常工作。所以如果有人能夠幫助我,那麼我的代碼將會非常棒,如果你能夠簡單地解釋一行代碼的功能,那將是非常好的。根據2條條件組合2個單元格+選擇最早和最近的日期VBA

我的問題:我有約5000個產品的需求歷史。

enter image description here

Articlecode:60012

日期:19-4-2014

需求:-1


我想這樣做的是以下幾點:

  1. Commbine兩行總結如果需求:
    • 商品代碼是相同的,
    • 日期相同

檢查條件和複製一整行的作品。我的代碼:

 Sub AddDuplicateDates() 

     'Define variables lastrow 
     Dim i, Lastrow 
     Lastrow = Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row 

     'Loop trough data and combine if date is the same 
     For i = 2 To Lastrow 
      If Sheets("Data").Cells(i, "A").Value = Sheets("Data").Cells(i - 1, "A").Value Then 
      If Sheets("Data").Cells(i, "B").Value = Sheets("Data").Cells(i - 1, "B").Value Then 


'Here I would like to copy cell Sheet("Data").Cells(i, "C") and add this 
'to Sheet("Datacorrected").Cells(i,"C") thus offset(0). How does this work? 


      Else   
      Sheets("Data").Cells(i, "A").EntireRow.Copy Destination:=Sheets("DataCorrected").Range("A" & Rows.Count).End(xlUp).Offset(1) 
      End If 
      End If 
      Next i 

      End Sub 
  • 選擇
    • 我已經設法只選擇唯一值(商品代碼)到一個不同的片的最新和最早日期:表(結果)
    • 我已經找到了一些主題,但不幸的是,所有這些操作都在同一張工作表上,並且沒有符合要求的條件(文章代碼)。例如:vba, excel : returning the earliest date value in this array of string。問題是我是VBA新手,並且不理解所有的代碼,所以我不明白它是如何工作的,所以我可以將它翻譯成我的問題。有人能幫我解決這個問題嗎?或者指出我能找到一個明確的解釋?
  • +0

    它確實有VBA做?無法你只是使用Pivot並報告數據而不是更改它?答案中的示例屏幕截圖... – xQbert

    +0

    是否要更改數據或在另一個工作表上創建摘要? – MatthewD

    +0

    是的,因爲我正在談論+/- 60.000線和一個數據透視表,這將是太耗時。 – user78820

    回答

    0

    此代碼是在一個命令按鈕的單擊事件。如果需要,您可以將其更改爲其他子版本。

    在你的VBA IDE中,進入工具菜單並選擇參考。選擇「Microstoft ActiveX數據對象2.8庫。

    這是假設你的第一個列表上表1.將寫數據到表2

    Private Sub CommandButton1_Click() 
        Dim dEarliest As Date 
        Dim dLatest As Date 
        Dim lLastCode As Long 
        Dim ws1 As Excel.Worksheet 
        Dim ws2 As Excel.Worksheet 
    
        Set ws1 = ActiveWorkbook.Sheets("Sheet1") 
        Set ws2 = ActiveWorkbook.Sheets("Sheet2") 
    
        Dim rs As New ADODB.Recordset 
        Dim lRow As Long 
    
        'Add fields to your recordset for storing data. You can store sums here. 
        With rs 
         .Fields.Append "Articlecode", adBigInt 
         .Fields.Append "Date", adDate 
         .Fields.Append "Demand", adInteger 
         .Open 
        End With 
    
        lRow = 1 
    
        ws1.Activate 
        'Loop through and record what is in the columns 
        Do While lRow <= ws1.UsedRange.Rows.count 
    
         'Filter to see if we already have this Articlecode and date 
         rs.Filter = "" 
         rs.Filter = "Articlecode=" & Trim(str(ws1.Range("A" & lRow).Value)) & " AND Date='" & Trim(str(ws1.Range("B" & lRow).Value)) & "'" 
    
         If rs.RecordCount = 1 Then 
          'If we find that we already have this record, add the demand to the current record. 
          rs.Fields("Demand").Value = rs.Fields("Demand").Value + ws1.Range("C" & lRow).Value 
          rs.Update 
         Else 
          'If we don't have this # and date, create a new record. 
          rs.AddNew 
          rs.Fields("Articlecode").Value = ws1.Range("A" & lRow).Value 
          rs.Fields("Date").Value = ws1.Range("B" & lRow).Value 
          rs.Fields("Demand").Value = ws1.Range("C" & lRow).Value 
          rs.Update 
         End If 
    
         lRow = lRow + 1 
         ws1.Range("A" & lRow).Activate 
        Loop 
    
        rs.Filter = "" 
        rs.Sort = "Articlecode, Date" 
    
        ws2.Activate 
    
        lRow = 1 
    
        'Here we loop through the data we collected and write it out. 
        Do While rs.EOF = False 
         ws2.Range("A" & lRow).Value = rs.Fields("Articlecode").Value 
         ws2.Range("B" & lRow).Value = Format(rs.Fields("Date").Value, "mm/dd/yyyy") 
         ws2.Range("C" & lRow).Value = rs.Fields("Demand").Value 
         lRow = lRow + 1 
        rs.MoveNext 
        Loop 
    
        'Now let's find the earliest and latest dates for each Articlecode 
    
        ws2.Range("E1").Value = "Articlecode" 
        ws2.Range("F1").Value = "Earliest" 
        ws2.Range("G1").Value = "Latest" 
    
        lRow = 1 
    
        rs.MoveFirst 
        Do While rs.EOF = False 
    
         If rs.Fields("Articlecode").Value <> lLastCode Then 
          'The first time we have an Articlecode we will write a line for it. 
          lRow = lRow + 1 
          ws2.Range("E" & lRow).Value = rs.Fields("Articlecode").Value 
          ws2.Range("F" & lRow).Value = Format(rs.Fields("Date").Value, "mm/dd/yyyy") 
          ws2.Range("G" & lRow).Value = Format(rs.Fields("Date").Value, "mm/dd/yyyy") 
         Else 
          'For other occurrences of this Articlecode we will just evaluate the dates. 
          If rs.Fields("Date").Value < ws2.Range("F" & lRow).Value Then 
           ws2.Range("F" & lRow).Value = Format(rs.Fields("Date").Value, "mm/dd/yyyy") 
          End If 
          If rs.Fields("Date").Value > ws2.Range("G" & lRow).Value Then 
           ws2.Range("G" & lRow).Value = Format(rs.Fields("Date").Value, "mm/dd/yyyy") 
          End If 
         End If 
    
         'Record the this articlecode 
         lLastCode = rs.Fields("Articlecode").Value 
    
         rs.MoveNext 
        Loop 
    
    End Sub 
    
    +0

    完美!創建一個記錄集對我來說是新的東西,但是我理解這個概念,很高興看到這會給你提供更新和創建新記錄的機會,現在我可以嘗試重現它並創建一個模塊以查找最早的日期,每個關鍵代碼的最新日期。非常感謝你:)。附:我想編輯代碼,但編輯長度必須爲6個字符。您在此行中輸入了錯字yyy而不是yyyy:ws2.Range(「B」&lRow).Value =格式(rs.Fields(「Date」)。Value,「mm/dd/yyy」) – user78820

    +0

    錯字固定。是的,記錄集非常有用。我用了很多年。在您撰寫摘要的循環中,您可以輕鬆查看日期。讓我知道你是否需要幫助。 – MatthewD

    +0

    我爲你添加了日期集合。請務必在重新運行之前清除摘要選項卡。我將日期添加到單元格A1和A2,因此如果您在舊的摘要上運行它,它可能看起來很糟糕。 – MatthewD

    1

    這是否在VBA做?或者使用數據透視表來報告數據是否符合需求?代碼並不總是答案...

    enter image description here

    +0

    謝謝,這會起作用,只是我想在事後做其他操作,然後它太費時了。我想找到平均需求間隔:#總天數(最近一天的最早日期)/#需求發生 – user78820