Board logo

標題: [發問] 取出包材"+"or"-"號之後的數值 [打印本頁]

作者: PJChen    時間: 2021-3-14 09:21     標題: 取出包材"+"or"-"號之後的數值

大家好:

以下三個品名,我想將進貨數量的加項or減項,提取到包材驗算!驗算工作表的[F16:AJ18]
16吋收縮膜(卷)
工業用伸縮膜(卷)
封箱膠帶(條)

包材報表!包材工作表,進貨填寫方式是固定在原數字欄加入進貨數量,偶爾也會有減項的數量,
提取數量的準則為"+",則取正數,"-",則取負數,目前已將需提取的數字,手動填入工作表中,
但我想改寫為自動抓取,不知有什麼函數,可針對數值"+"or"-"號,取出正負數?
[attach]33127[/attach]
作者: PJChen    時間: 2021-3-17 21:20

若是麼函數,無法達成,尚不知VBA能否做得到....對數值最最後一個"+"or"-"號&取出正負數?
作者: jcchiang    時間: 2021-3-31 10:30

回復 2# PJChen

巨集請放於"包材驗算"檔案
資料位置以原附件設定,如有不同請自行調整

Sub ex()
Dim Arr As Variant, d As Object, a As Variant, b As Variant, X%, Y%
Set d = CreateObject("Scripting.Dictionary")
With Workbooks.Open(ThisWorkbook.Path & "\" & "包材報表.xlsx").Sheets("包材")
   Set Arr = .Range(.[b5], .[P7])   '資料範圍
End With
For X = 1 To Arr.Rows.Count
   For Y = 4 To Arr.Columns.Count
      If Arr(X, Y).HasFormula Then    '判斷儲存格是否為公式
         If Arr(X, Y).FormulaR1C1Local Like "*+*" Then     '判斷公式內是否為"+"
            d(Arr(X, 1) & Arr(X, Y).Offset(-3 - X)) = Split(Arr(X, Y).FormulaR1C1Local, "+")(1)  '資料寫入字典
         Else                                              '判斷公式內為"-"
            d(Arr(X, 1) & Arr(X, Y).Offset(-3 - X)) = "-" & Split(Arr(X, Y).FormulaR1C1Local, "-")(1)   '資料寫入字典
         End If
      End If
   Next
Next
Workbooks("包材報表.xlsx").Close False
For Each a In Range([C16], [C18])      '包材區間
   For Each b In Range([F2], [F2].End(2))   '日期區間
      If d.exists(a & b) Then Cells(a.Row, b.Column) = d(a & b)  '將字典資料寫入相符的儲存格
   Next
Next
Set d = Nothing
End Sub
作者: PJChen    時間: 2021-4-1 23:44

回復 3# jcchiang

您好,
試做時,發生問題如下,請教....
1) 封箱膠帶(條)抓不到資料
將資料範圍Set Arr = .Range(.[b5], .[P7])
改為   Set Arr = .Range(.[b5], .[AI11]),但無法執行

.Range(.[b5], .[AI11])的範圍,為整個月份的資料
[attach]33162[/attach]
作者: jcchiang    時間: 2021-4-6 08:08

回復 4# PJChen

1.因為資料欄位裡有的欄位並沒有"+","-",卻寫成"=2200"所以被誤判為公式(如:多莓果紙箱(片),無加糖紙箱(片))
將判斷式增加 "-"的條件,只要沒有"+" & "-"就不分拆
    If Arr(X, Y).HasFormula Then    '判斷儲存格是否為公式
         If Arr(X, Y).FormulaR1C1Local Like "*+*" Then     '判斷公式內是否為"+"
            d(Arr(X, 1) & Arr(X, Y).Offset(-3 - X)) = Split(Arr(X, Y).FormulaR1C1Local, "+")(1)  '資料寫入字典
         ElseIf Arr(X, Y).FormulaR1C1Local Like "*-*" Then '判斷公式內為"-"
            d(Arr(X, 1) & Arr(X, Y).Offset(-3 - X)) = "-" & Split(Arr(X, Y).FormulaR1C1Local, "-")(1)   '資料寫入字典
         End If
      End If
2.包材報表有"封箱膠帶(條)"但包材驗算裡沒有"封箱膠帶(條)"而是"封箱膠帶()"
作者: PJChen    時間: 2021-4-6 16:30

回復 5# jcchiang

謝謝
現在可正常抓取到資料了
作者: PJChen    時間: 2021-4-6 18:37

回復 5# jcchiang

您好,
原程式測試沒問題
來源資料範圍不變,但想將截取載入進貨的資料擴大為
For Each a In Range([C16], [C25])
但執行後會卡在這裡無法繼續,請幫忙看看是否要修改?
d(Arr(X, 1) & Arr(X, Y).Offset(-3 - X)) = Split(Arr(X, Y).FormulaR1C1Local, "+")(1)  '資料寫入字典
[attach]33170[/attach]
作者: jcchiang    時間: 2021-4-7 08:01

回復 7# PJChen

錯誤原因是因為
Set Arr = .Range(.[b5], .[AI11]) 變成 Set Arr = .Range(.[b2], .[AI11])
Offset位置修改即可
If Arr(X, Y).FormulaR1C1Local Like "*+*" Then     '判斷公式內是否為"+"
            d(Arr(X, 1) & Arr(X, Y).Offset(-X)) = Split(Arr(X, Y).FormulaR1C1Local, "+")(1)   '資料寫入字典
            
            ElseIf Arr(X, Y).FormulaR1C1Local Like "*-*" Then '判斷公式內為"-"
            d(Arr(X, 1) & Arr(X, Y).Offset(-X)) = "-" & Split(Arr(X, Y).FormulaR1C1Local, "-")(1)    '資料寫入字典
         End If
作者: PJChen    時間: 2021-4-7 21:37

回復 8# jcchiang

您好,
1) 改完後,執行沒有任何動作
2) 請問 這段要怎麼解讀呢?
            d(Arr(X, 1) & Arr(X, Y).Offset(-X)) = Split(Arr(X, Y).FormulaR1C1Local, "+")(1)   '資料寫入字典            
            ElseIf Arr(X, Y).FormulaR1C1Local Like "*-*" Then '判斷公式內為"-"
            d(Arr(X, 1) & Arr(X, Y).Offset(-X)) = "-" & Split(Arr(X, Y).FormulaR1C1Local, "-")(1)    '資料寫入字典
[attach]33171[/attach]
作者: PJChen    時間: 2021-4-9 00:37

回復 8# jcchiang

不知道發生什麼事,原來程式也不能運作了....
  [attach]33174[/attach]
作者: PJChen    時間: 2021-4-9 21:11

回復 10# PJChen

不過我並不要這個原程式操作,希望有人可以幫忙看看,卡了很多天了....
    [attach]33176[/attach]
作者: 軒云熊    時間: 2021-4-9 22:02

回復 11# PJChen

有空幫我試試看 是不是你要的

[attach]33178[/attach]
作者: PJChen    時間: 2021-4-9 23:26

回復 12# 軒云熊
謝謝熊大,
稍微修改後,截取資料正確,請問:
1) 我不想關閉來源檔Workbooks("包材報表.xlsx").Close False,但會無法執行,且每執行一次就增加二欄,原因是什麼?
2) 是否因為這個For I = 1 To 2: Columns(4).Insert , 2: Next I,為什需要增加2欄呢?
3) 我沒看過這種寫法,範圍為何是倒著寫呢?Arr = Range("AK11:C2").FormulaR1C1Local
4) 能否幫忙註解程式的意思?
感激不盡....

Range("E16:AJ25").ClearContents
    Workbooks.Open ThisWorkbook.Path & "\" & "包材報表.xlsx"
    For I = 1 To 2: Columns(4).Insert , 2: Next I
    Arr = Range("AK11:C2").FormulaR1C1Local
    Workbooks("包材報表.xlsx").Close False
    Brr = Range("B16:AJ25")
   
    For X = 1 To UBound(Arr, 1)
        For Y = 1 To UBound(Brr, 1)
            If Trim(Arr(X, 1)) = Trim(Brr(Y, 1)) Then
                 For E = 1 To UBound(Arr, 2)
                    If Arr(X, E) Like "*-*" Then
                        G = Split(Arr(X, E), "-")(1)
                        Brr(Y, E) = "=-" & G
                    ElseIf Arr(X, E) Like "*+*" Then
                        G = Split(Arr(X, E), "+")(1)
                        Brr(Y, E) = "=+" & G
                    End If
                Next E
            End If
        Next Y
    Next X

      Range("B16:AJ25") = Brr
作者: 軒云熊    時間: 2021-4-10 07:24

回復 13# PJChen
把Brr(Y, E) = "=-" & G
跟Brr(Y, E) = "=+" & G
改成Brr(Y, E+2) = "=-" & G
在把插入欄删除
作者: 軒云熊    時間: 2021-4-10 20:54

本帖最後由 軒云熊 於 2021-4-10 21:00 編輯

回復 13# PJChen
這是參考 jcchiang 前輩的寫法所修改的  感謝 jcchiang 前輩的提點
已加入註解 有稍微修改過 有空再幫我試試看 感謝

[attach]33181[/attach]
作者: PJChen    時間: 2021-4-12 00:40

回復 15# 軒云熊

現在可以正常截取資料了,感謝您....
作者: jcchiang    時間: 2021-4-12 18:47

回復 10# PJChen


  難道你沒有發現驗算檔案的日期已經是4月嗎
  而包材的日期還是3月,月份都不一樣了,如何相符?
作者: PJChen    時間: 2021-4-18 00:01

回復 15# 軒云熊
熊大好,
程式在使用時,發現一個問題:
例如:包材報表的4/24封箱膠帶(條)的數量是4,
4/25有進貨,但當盤點時,已用掉2,我在4/25 key -2+50會等於48,但需要截取的數字是進貨量50,
像這種情形如何略過-2只抓50?
註:包材報表每個儲存格的數字,都只要抓最後一個+ or -的數字就好.
[attach]33216[/attach][attach]33216[/attach]
作者: PJChen    時間: 2021-4-20 23:29

回復 15# 軒云熊
熊大好,
附件已將程式update   [attach]33226[/attach]
包材驗算報表每個儲存格都核對,發現有些值會抓錯,
1) 4/10[O17]=16000*2....抓到的資料6000*2
2) 4/30[AI25]...抓不到數值
再麻煩幫忙看下....感謝




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