標題:
判斷式出現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應較適合:
Sub TEST()
Dim R&, xD, Arr, Brr, j&, Jm&, T$, N&
[L:O].ClearContents
[L1:O1] = Array("日期", "樣式", "工作人員", "數量")
R = Cells(Rows.Count, 1).End(xlUp).Row - 1
If R < 2 Then Exit Sub
Arr = [A2:F2].Resize(R)
ReDim Brr(1 To R, 1 To 4)
Set xD = CreateObject("Scripting.Dictionary")
For j = 1 To R
T = Arr(j, 1) & Arr(j, 2): N = xD(T)
If N = 0 Then Jm = Jm + 1: xD(T) = Jm: N = Jm
Brr(N, 1) = Arr(j, 1): Brr(N, 2) = Arr(j, 2)
If InStr(Brr(N, 3), Arr(j, 4)) = 0 Then
Brr(N, 3) = Trim(Brr(N, 3) & " " & Arr(j, 4))
End If
Brr(N, 4) = Brr(N, 4) + Val(Arr(j, 6))
Next j
[L2:O2].Resize(Jm) = Brr
End Sub
複製代碼
作者:
mark761222
時間:
2015-9-26 17:32
TO 准提部林
謝謝你的解答真的成功了
可是大大你的程式碼對我來說有點難度,不知道能不能請你幫個忙,程式後面幫忙註解一下
,讓我更進一步的學習呢?
拜託了
作者:
准提部林
時間:
2015-9-26 19:03
本帖最後由 准提部林 於 2015-9-26 19:07 編輯
回復
3#
mark761222
花個時間研究看看, 不難:(程式有部份修改)
Sub TEST()
Dim R&, xD, Arr, Brr, j&, Jm&, T$, N&
'↓清除之前的結果
[L:O].ClearContents
[L1:O1] = Array("日期", "樣式", "工作人員", "數量")
'↓以A欄取得最後一筆〔列號〕
R = Cells(Rows.Count, 1).End(xlUp).Row
If R < 2 Then Exit Sub
'↓將資料範圍設為陣列(含標題列)
Arr = [A1:F1].Resize(R)
'↓設一個空陣列,以接受結果
ReDim Brr(1 To R, 1 To 4)
'↓設一個字典檔,以唯一〔索引值〕收集相關數據
Set xD = CreateObject("Scripting.Dictionary")
For j = 2 To R
'↓A&B欄文字合為〔索引值〕
T = Arr(j, 1) & Arr(j, 2)
'↓取出〔索引值〕在字典檔中所帶的〔序號〕,
這〔序號〕用來識別填入〔陣列〕的〔位置〕
N = xD(T)
'↓如果〔序號〕為0,表示是新的〔索引值〕,
將〔序號〕遞增1,再納入字典檔
If N = 0 Then Jm = Jm + 1: xD(T) = Jm: N = Jm
'↓填入〔日期.樣式〕
Brr(N, 1) = Arr(j, 1): Brr(N, 2) = Arr(j, 2)
'↓填入〔工作人員〕,InStr 用來判斷是否重覆
If InStr(Brr(N, 3), Arr(j, 4)) = 0 Then
Brr(N, 3) = Trim(Brr(N, 3) & " " & Arr(j, 4))
End If
'↓填入〔累計數量〕
Brr(N, 4) = Brr(N, 4) + Val(Arr(j, 6))
Next j
'↓列出結果
[L2:O2].Resize(Jm) = Brr
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/)