Board logo

標題: 判斷式出現0,多餘的空白 [打印本頁]

作者: mark761222    時間: 2015-9-25 23:45     標題: 判斷式出現0,多餘的空白

[attach]22094[/attach]
1.運算元多餘的空白如何清除  前提工作人員:編號中間要有空格或是、隔開    如 S01、S02、S03
2.沒資料會產生0
3.判斷式設定空白導致沒資料會產生0,如何不產生0

麻煩各位大大幫忙解答,或提出好意見
這問題困惑好久

附件有我問題檔案
[attach]22095[/attach]
作者: 准提部林    時間: 2015-9-26 10:47

這問題用VBA應較適合:
  1. Sub TEST()
  2. Dim R&, xD, Arr, Brr, j&, Jm&, T$, N&
  3. [L:O].ClearContents
  4. [L1:O1] = Array("日期", "樣式", "工作人員", "數量")
  5.  
  6. R = Cells(Rows.Count, 1).End(xlUp).Row - 1
  7. If R < 2 Then Exit Sub
  8. Arr = [A2:F2].Resize(R)
  9. ReDim Brr(1 To R, 1 To 4)
  10. Set xD = CreateObject("Scripting.Dictionary")
  11.  
  12. For j = 1 To R
  13.   T = Arr(j, 1) & Arr(j, 2):  N = xD(T)
  14.   If N = 0 Then Jm = Jm + 1: xD(T) = Jm:  N = Jm
  15.  
  16.   Brr(N, 1) = Arr(j, 1): Brr(N, 2) = Arr(j, 2)
  17.   If InStr(Brr(N, 3), Arr(j, 4)) = 0 Then
  18.     Brr(N, 3) = Trim(Brr(N, 3) & " " & Arr(j, 4))
  19.   End If
  20.   Brr(N, 4) = Brr(N, 4) + Val(Arr(j, 6))
  21. Next j
  22. [L2:O2].Resize(Jm) = Brr
  23. End Sub
複製代碼

作者: mark761222    時間: 2015-9-26 17:32

TO 准提部林
謝謝你的解答真的成功了
可是大大你的程式碼對我來說有點難度,不知道能不能請你幫個忙,程式後面幫忙註解一下
,讓我更進一步的學習呢?
拜託了
作者: 准提部林    時間: 2015-9-26 19:03

本帖最後由 准提部林 於 2015-9-26 19:07 編輯

回復 3# mark761222

花個時間研究看看, 不難:(程式有部份修改)
  1. Sub TEST()
  2. Dim R&, xD, Arr, Brr, j&, Jm&, T$, N&
  3. '↓清除之前的結果
  4. [L:O].ClearContents
  5. [L1:O1] = Array("日期", "樣式", "工作人員", "數量") 
  6.  
  7. '↓以A欄取得最後一筆〔列號〕
  8. R = Cells(Rows.Count, 1).End(xlUp).Row
  9. If R < 2 Then Exit Sub
  10.  
  11. '↓將資料範圍設為陣列(含標題列)
  12. Arr = [A1:F1].Resize(R)
  13.  
  14. '↓設一個空陣列,以接受結果
  15. ReDim Brr(1 To R, 1 To 4)
  16.  
  17. '↓設一個字典檔,以唯一〔索引值〕收集相關數據
  18. Set xD = CreateObject("Scripting.Dictionary")
  19.  
  20. For j = 2 To R
  21.   '↓A&B欄文字合為〔索引值〕
  22.   T = Arr(j, 1) & Arr(j, 2)
  23.  
  24.   '↓取出〔索引值〕在字典檔中所帶的〔序號〕,
  25.    這〔序號〕用來識別填入〔陣列〕的〔位置〕
  26.   N = xD(T) 
  27.  
  28.   '↓如果〔序號〕為0,表示是新的〔索引值〕,
  29.    將〔序號〕遞增1,再納入字典檔
  30.   If N = 0 Then Jm = Jm + 1: xD(T) = Jm:  N = Jm
  31.  
  32.   '↓填入〔日期.樣式〕
  33.   Brr(N, 1) = Arr(j, 1): Brr(N, 2) = Arr(j, 2)
  34.  
  35.   '↓填入〔工作人員〕,InStr 用來判斷是否重覆
  36.   If InStr(Brr(N, 3), Arr(j, 4)) = 0 Then
  37.     Brr(N, 3) = Trim(Brr(N, 3) & " " & Arr(j, 4))
  38.   End If
  39.  
  40.   '↓填入〔累計數量〕
  41.   Brr(N, 4) = Brr(N, 4) + Val(Arr(j, 6))
  42. Next j
  43.  
  44. '↓列出結果
  45. [L2:O2].Resize(Jm) = Brr
  46. End Sub
複製代碼

作者: mark761222    時間: 2015-9-26 20:29

有幾個問題要請教版大
抱歉問這麼多問題

問題一
R& 後面的&與$代表的涵義是?

問題二
[L:O].ClearContents
[L1:O1] = Array("日期", "樣式", "工作人員", "數量")

[L:O]與[L1:O1] 這是屬於陣列嗎?
[L:O]是不是帶表[L~到數字任何數:O~到任何數]
所以底下假如有[L1:O1]、[L2:O2]、[L3:O3]都可以清除嗎?

問題三
'↓將資料範圍設為陣列(含標題列)
Arr = [A1:F1].Resize(R)

Resize(R)   <這個R代表是什麼意思?

問題四
  T = Arr(j, 1) & Arr(j, 2)
 
  '↓取出〔索引值〕在字典檔中所帶的〔序號〕,
   這〔序號〕用來識別填入〔陣列〕的〔位置〕
  N = xD(T) 
括號中的T跟上面那個T有相關性嗎?
作者: 准提部林    時間: 2015-9-26 21:23

回復 5# mark761222


[A:B] 與Range("A:B") 同義
[A2:B5] 與Range("A2:B5") 同義

其它問題若要說明,可能寫好幾頁也不一定能說明白,
買書或多看論壇的資料,慢慢進階吧!
作者: mark761222    時間: 2015-9-28 21:31

回復 6# 准提部林


    謝謝,我查了許多網站,已經將程式大概看懂了,有部分還是不懂需要一段時間消化一下,感謝你的指導
作者: mark761222    時間: 2015-9-28 21:40

這邊分享給大家一下
Dim R&  ,&代表長整數
Dim T$   ,$代表字串
以上是快速寫法
[L:O].ClearContents               清除[L:O]所有資料
[L1:O1] = Array("日期", "樣式", "工作人員", "數量")   將日期,樣式,工作人員,數量寫到儲存格當中
R = Cells(Rows.Count, 1).End(xlUp).Row   將取得最後一筆的資料傳給R(以A欄取得最後一筆〔列號〕)
後面會陸續補上,在忙
作者: Andy2483    時間: 2023-5-9 09:20

回復 2# 准提部林


    謝謝論壇,謝謝前輩
後學藉此帖練習陣列與字典,學習方案如下,請前輩再指導

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

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


Option Explicit
Sub TEST_1()
Dim Brr, Y, A, i&, j%, Ta$, Tb$, Td$, TT$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是字典
Brr = Range([F1], [A65536].End(3))
'↑令變數是二維陣列並以儲存格值倒入
A = Array(, 1, 2, 4, 6)
'↑設個一維陣列讓後續的結果迴圈抓取指定欄位
For i = 1 To UBound(Brr)
'↑設順迴圈
   Ta = Brr(i, 1): Tb = Brr(i, 2): Td = Brr(i, 4): TT = Ta & "|" & Tb
   If Y(TT) = "" Then
   '↑這疑問句已經不知不覺將 key是TT變數,item是"" ,納入在Y字典中了
      Y(TT) = Y.Count
      '↑索性就依當下key的數量當變數紀錄此key在陣列中的索引列號
      For j = 1 To 4: Brr(Y.Count, j) = Brr(i, A(j)): Next: GoTo i01
      '↑因為是首次納入此key,所以將各欄位值帶入指定位置,覆蓋舊陣列值,
      '↑以上就已經處理了首次值,不必累加數量,所以跳到i01指定位置繼續執行

   End If
   Brr(Y(TT), 4) = Brr(Y(TT), 4) + Brr(i, 6)
   '↑如果程序能跑到這裡,代表不是首次,將該key所帶的item調出來(索引列號),
   '讓數量做累加

   If InStr(" " & Brr(Y(TT), 3) & " ", " " & Td & " ") = 0 Then
      Brr(Y(TT), 3) = Trim(Brr(Y(TT), 3) & " " & Td)
   End If
   '↑將不重複工作人員納入
i01: Next
[L:O].ClearContents
'↑清除結果儲存格舊資料
If Y.Count > 1 Then [L1].Resize(Y.Count, 4) = Brr
'↑如果字典裡keys數>1!就從[L1]開始貼入Brr陣列局部值
Set Y = Nothing: Erase Brr
'↑釋放變數
End Sub




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