返回列表 上一主題 發帖

[發問] 取出包材"+"or"-"號之後的數值

[發問] 取出包材"+"or"-"號之後的數值

大家好:

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

包材報表!包材工作表,進貨填寫方式是固定在原數字欄加入進貨數量,偶爾也會有減項的數量,
提取數量的準則為"+",則取正數,"-",則取負數,目前已將需提取的數字,手動填入工作表中,
但我想改寫為自動抓取,不知有什麼函數,可針對數值"+"or"-"號,取出正負數?
包材.rar (28.83 KB)

若是麼函數,無法達成,尚不知VBA能否做得到....對數值最最後一個"+"or"-"號&取出正負數?

TOP

回復 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

TOP

回復 3# jcchiang

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

.Range(.[b5], .[AI11])的範圍,為整個月份的資料
包材報表_取出最後一個正負號的值.rar (37.61 KB)

TOP

回復 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.包材報表有"封箱膠帶(條)"但包材驗算裡沒有"封箱膠帶(條)"而是"封箱膠帶()"

TOP

回復 5# jcchiang

謝謝
現在可正常抓取到資料了

TOP

回復 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)  '資料寫入字典
包材報表_取出最後一個正負號的值.rar (47 KB)

TOP

回復 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

TOP

回復 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)    '資料寫入字典
包材報表_取出最後一個正負號的值.rar (46.57 KB)

TOP

回復 8# jcchiang

不知道發生什麼事,原來程式也不能運作了....
   包材報表_取出最後一個正負號的值.rar (39.36 KB)

TOP

        靜思自在 : 一個缺口的杯子,如果換一個角度看它,它仍然是圓的。
返回列表 上一主題