Board logo

標題: [發問] (已解決)條件下自動編號 [打印本頁]

作者: freeffly    時間: 2012-5-8 17:21     標題: (已解決)條件下自動編號

本帖最後由 freeffly 於 2012-5-9 15:49 編輯

附檔
我想要找出同一天賣給同依客戶不同單價者編號

判斷條件
A、C、D、F欄
A跟C欄同一個客戶且品號相同
D欄-跟-之間的序號一樣者,因為這各是日期的序號
F欄如果單價不一樣的話(原本我還想不到怎麼判斷,目前只想到平均單價與單價不一樣就可以找出來)

符合以上就在G欄自動變號


[attach]10862[/attach]
作者: Hsieh    時間: 2012-5-8 21:08

回復 1# freeffly
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. For Each a In Range([A2], [A65536].End(xlUp))
  4.    d(a & a.Offset(, 2)) = ""
  5.    a.Offset(, 6) = "A" & d.Count
  6. Next
  7. End Sub
複製代碼

作者: freeffly    時間: 2012-5-9 08:45

回復 2# Hsieh

版主你的方法在如果不符合條件下也會編號
我想要將不符合條件的部份空白
如附檔黃色區塊因為單價相同應該不符合條件
另外如果資料只有一筆如綠色區塊應該也要空白

資料的用途是想找出
哪一個產品哪一天賣給同一個客戶有不同單價情形

[attach]10875[/attach]
作者: Hsieh    時間: 2012-5-9 11:08

回復 3# freeffly
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. For Each a In Range([A2], [A65536].End(xlUp))
  4.    m = a & a.Offset(, 2) & Split(a.Offset(, 3), "-")(1)
  5.    If IsEmpty(d(m)) Then
  6.       d(m) = Array(1, a.Offset(, 5))
  7.    Else
  8.       ar = d(m)
  9.       If ar(1) <> a.Offset(, 5) Then
  10.       ar(0) = ar(0) + 1
  11.       d(m) = ar
  12.       End If
  13.       Erase ar
  14.    End If
  15. Next
  16. For Each ky In d.keys
  17.   If d(ky)(0) = 1 Then d.Remove ky
  18. Next

  19. For Each a In Range([A2], [A65536].End(xlUp))
  20.    m = a & a.Offset(, 2) & Split(a.Offset(, 3), "-")(1)
  21.    i = Application.Match(m, d.keys, 0)
  22.    If IsNumeric(i) Then
  23.    a.Offset(, 6) = "A" & i
  24.    Else
  25.    a.Offset(, 6) = ""
  26.    End If
  27. Next

  28. End Sub
複製代碼

作者: freeffly    時間: 2012-5-9 11:46

回復 4# Hsieh


    看不熟析的寫法就好像在看比較深的英文
   大概可以知道意思
   請問版主是不是只能判斷兩各?
   
   附檔我是了依下同一天同一個各戶有3筆交易的情形下的狀況
  雖然目前公司只有2筆(A品、B品),因為不知道會不會有第三筆(同時賣ABC品)所以想知道
  如果是超過兩筆的情形可以處理嗎



[attach]10876[/attach]
作者: Hsieh    時間: 2012-5-9 12:08

回復 5# freeffly
因為是以A欄作客戶資料
所以必須將A欄客戶代號填滿
作者: freeffly    時間: 2012-5-9 13:36

回復 6# Hsieh


   看到了
  沒注意到客戶代號那一欄的資料有變
  字典跟陣列對我來說還是算很陌生
  請問版主(1)這各是必要的嗎?
作者: Hsieh    時間: 2012-5-9 15:23

回復 7# freeffly
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. For Each a In Range([A2], [A65536].End(xlUp))
  4.    m = a & a.Offset(, 2) & Split(a.Offset(, 3), "-")(1) '串接A、C欄與D欄的日期部分字串
  5.    If IsEmpty(d(m)) Then '當字典以m為索引的內容初始化時執行
  6.       d(m) = Array(1, a.Offset(, 5)) '將A欄與F欄為陣列賦給m為索引的內容
  7.       
  8.    Else '當出現第二個以上的m
  9.       ar = d(m) '取出字典內容
  10.       If ar(1) <> a.Offset(, 5) Then '當陣列第二個元素值與F欄不同
  11.       ar(0) = ar(0) + 1 '陣列第一個值加一,當成同索引且單價不同的計數
  12.       d(m) = ar '將陣列回存到字典
  13.       End If
  14.       Erase ar '清除陣列
  15.    End If
  16. Next
  17. For Each ky In d.keys
  18.   If d(ky)(0) = 1 Then d.Remove ky '如果字典內容第一個項目是1,也就是單一計數就移除該索引內容
  19. Next

  20. For Each a In Range([A2], [A65536].End(xlUp))
  21.    m = a & a.Offset(, 2) & Split(a.Offset(, 3), "-")(1)
  22.    i = Application.Match(m, d.keys, 0) '取得該字串是字典第幾個項目
  23.    If IsNumeric(i) Then
  24.    a.Offset(, 6) = "A" & i '寫入編號
  25.    Else
  26.    a.Offset(, 6) = "" '不字典內就清空G欄
  27.    End If
  28. Next

  29. End Sub
複製代碼

作者: freeffly    時間: 2012-5-9 15:45

回復 8# Hsieh


    謝謝版主花時間解釋
   幾次看到版主使用字典方式處理
   深深覺得自己應該要花多點時間學習字典
   逐行執行時可以查詢結果
   這各部份讓我有點知道程式碼作用
作者: Andy2483    時間: 2023-4-7 11:53

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,今天才試出Union()的結果也是陣列,學習方案如下,
請各位前輩指教

執行前:
[attach]36094[/attach]

執行結果:
[attach]36095[/attach]


Option Explicit
Sub TEST()
Dim Brr, V, Y, N&, i&, T1$, T3$, T4$, T6$, TT1$, xR As Range
Set Y = CreateObject("Scripting.Dictionary")
Set xR = Range([G1], Cells(Rows.Count, "A").End(xlUp)): Brr = xR
For i = 2 To UBound(Brr)
   T1 = Brr(i, 1): T3 = Brr(i, 3): T4 = Brr(i, 4): T6 = Brr(i, 6)
   TT1 = T1 & "|" & T3 & "|" & Split(T4 & "-", "-")(1)
   If Y.Exists(TT1) = Empty Then
      Set Y(TT1) = Cells(i, 7): Y(TT1 & "單價") = Brr(i, 6)
      ElseIf Brr(i, 6) <> Y(TT1 & "單價") Then
         Set Y(TT1) = Union(Y(TT1), Cells(i, 7)): Y(TT1 & "單價") = "|"
   End If
Next
xR.Offset(1, 6).ClearContents
For Each V In Y.items
   If IsArray(V) Then N = N + 1: V.Value = "A" & N
Next
Set Y = Nothing: Set xR = Nothing: Erase Brr
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)