返回列表 上一主題 發帖

[發問] 讓公式的值,直接帶入儲存格

回復 69# PJChen

1) A欄月份2020..6有何做用??? 改成202006不是更直接, 排序也沒問題!

2) 公式是由上而下累計的, 指定日期可能會有誤差發生? 不太可靠!

3) =IF(COUNTIF(北區!$B$3:$B3,北區!$B3)=1,SUMIFS(台中!$D:$D,台中!$B:$B,"大",台中!$A:$A,北區!$B3),IF(COUNTIF(北區!$B$3:$B3,北區!$B3)=2,SUMIFS(新竹!$D:$D,新竹!$B:$B,"大",新竹!$A:$A,北區!$B4),IF(COUNTIF(北區!$B$3:$B3,北區!$B3)=3,SUMIFS(南區!$D:$D,南區!$B:$B,"大",南區!$A:$A,北區!$B5),"")))
工作表只有"北區", 其它不見, 怎測試程式及公式???

提問前應再次確認給的資料及規則說明是否完整,
僅從公式及程式碼中去解讀需求規則, 是要花更多時間的~~

TOP

回復 69# PJChen
這個檔案資料都是在計算一些數值,如果是我自己要用,我覺得函數公式寫在儲存格下拉就解決了
因為實際的資料多寡只有你了解,加上部份資料也沒提供(准大提及部份),無法驗證
只能將你所提供的程式整理一下,至於其他所需的部份只能靠你自行增加囉!!

Sub 北區_A_EX()
Dim Sh As Worksheet, xS As Worksheet, xR
Set xS = ThisWorkbook.Sheets("VBA")  '程式來源
Set Sh = Workbooks("全省核銷明細.xlsm").Sheets("北區")
d = xS.[AA3] 'Date
Sh.Activate
'------------ 'A 取B欄年.月
For Each xR In Range([b3], [b65535].End(3)) '向上 End(3) = End(xlup).Row
   If xR >= d Then
      xR.Offset(, -1) = Year(xR) & ".." & Month(xR)     'A 取B欄年.月
      xR.Offset(, 9) = xR.Offset(-1, 9) + xR.Offset(, 5) - xR.Offset(, 4) - xR.Offset(, 6) - xR.Offset(, 7) + xR.Offset(, 8) '北區_K_結餘
      xR.Offset(, 22) = xR.Offset(-1, 22) + xR.Offset(, 5) + xR.Offset(, 8) - xR.Offset(, 6) - xR.Offset(, 7) - xR.Offset(, 21) '北區_X_派板結餘
      '-------------------------R欄無單號
      If xR.Offset(, 16) = "" Then
         xR.Offset(, 3) = "無交貨"
      Else
         xR.Offset(, 3) = xR.Offset(, 18) & xR.Offset(, 17) & xR.Offset(, 16) 'T&S&R
      End If
      '------------------------------供應商
      If xR.Offset(, 1) = "大" Then 'l+g-f+j-n
         xR.Offset(, 10) = xR.Offset(-1, 10) + xR.Offset(, 5) - xR.Offset(, 4) + xR.Offset(, 8) - xR.Offset(, 12)
         xR.Offset(, 11) = xR.Offset(-1, 11) - xR.Offset(, 13)
      Else  '不是"大"應該就是"美"囉
         xR.Offset(, 10) = xR.Offset(-1, 10) + xR.Offset(, 8) - xR.Offset(, 12)
         xR.Offset(, 11) = xR.Offset(-1, 11) + xR.Offset(, 5) - xR.Offset(, 4) - xR.Offset(, 13)
      End If
      '------------------------------店名
      If xR.Offset(, 2) = "中和" Or xR.Offset(, 2) = "內湖" Or xR.Offset(, 2) = "汐止" Then
         xR.Offset(, 19) = xR
      Else
         xR.Offset(, 19) = xR + 1
      End If
      '-----------------------------盤點差異
      If xR.Offset(, 24) = "" Then
         xR.Offset(, 23) = ""
      Else 'z-x
         xR.Offset(, 23) = xR.Offset(, 24) - xR.Offset(, 22)
      End If
   End If
Next
End Sub

TOP

本帖最後由 准提部林 於 2020-6-25 10:11 編輯

很麻煩的表格~~如果每天都要處理~~很累吧!!!
公式之間有互相引用, 所以上面的方法都會出錯的~~
若用逐格填入~~不會快到哪???

看發帖的檔案有不少版本, 公司應有一定的規模, 為何不請專業的去設計?
時間就是金錢, 除了浪費時間精神體力外, 資料也可能算錯!!!
我們有空也只能稍幫幾許, 但總不能這樣無止境的做, 一切還是要靠自己~~

弄了兩種版本,
1) 字典+陣列版, 寫一半本想放棄, 因為可能(應該是)看不懂程式碼, 給了也沒用吧!! 太複雜~~
Xl0000140(字典+陣列).rar (45.62 KB)

2) 輔助公式版, 能增進多少速度, 沒實測
Xl0000140(輔助公式).rar (56.41 KB)

所有的計算都從上面帖子中的公式用猜的(幾乎每次猜), 依樣畫葫, 自行去修正~~


======================================================

TOP

本帖最後由 PJChen 於 2020-6-25 22:46 編輯

回復 73# 准提部林
感謝准大,
我會再抓時間測試

我們公司規模很小、很摳門,部門內所有檔案都由我設計,
看起來權限好像很大,但很累(這是個沒人想接的工作),
不過我有天馬行空的想像力,連做夢都會夢見excel、
夢見公式的運作,但能否實現,又是另一回事!
大部份的問題我都能自行解決,各位看到我發問,
其實只是冰山一角^.^
不過說到底是能力有限,能拼湊多少算多少囉...

TOP

本帖最後由 PJChen 於 2020-6-25 22:43 編輯

回復 58# jcchiang

您好,
先說聲謝謝,你寫的程式,總是讓我得到很大的啟發
這段程式,我稍作修改,希望它可以自動對應,增加方便性,
但有些二個問題我無法解決...程式已寫入macro_D    更新理貨單.rar (130.47 KB)
macro_D的"理貨單"工作表,W1 & W2的對應值
x1 = xS.[w1] '對應 活動範圍a
x2 = xS.[w2] '對應檔名
For k = 1 To 7 (原7個檔,先用"下個月理貨單"資料夾的2個檔測試)
xS.[V1] = k
當xS.[w1]=1="暖暖1"
xS.[w2]="暖暖",則打開公用理貨含有"暖暖"字樣的檔案,
將理貨單II的B欄="暖暖1"的儲存格F:P的資料,
copy到"1"工作表的B3貼上值,
使用時發現程式copy資料並不是很快速
For Each a In Range("B:B")
If a = x1 Then d(a.Address) = d(a.Address)

所以我是用理貨單II的F:P區域覆蓋B:L,想使copy一次完成,
然後再將D:F,I:J的公式代入後下拉
現在遇到問題如下:
1) 雖然寫了
For k = 1 To 7
    xS.[V1] = k
但它只會打開第一個檔,我要如何讓它把"下個月理貨單"資料夾,全部檔都依序打開,
然後依k = 1 To 7,所對應的值貼到該貼的地方?

2) D:F,I:J的公式,key入後,希望出現公式,而不是值,例如:林口的檔案
I3值是50,但我希望程式
[i3] = "=" & "Int(" & [m3] & "/" & [L3] & ")" '箱數
[i3] 所得到的答案是公式=INT(M3/L3),
D:F,I:J...4欄也都希望呈現公式而非值

TOP

回復 58# jcchiang
我已經解決問題囉...感謝

TOP

本帖最後由 PJChen 於 2020-7-7 19:36 編輯

回復 42# 准提部林
准大好,
我用42樓的程式,修改後用來抓取客戶下單的"訂購數",修改後的程式如下:
  1. Sub 理貨訂購量()
  2. Dim Rw&, xR As Range, xH As Range, c%, Fx$
  3. Rw = Cells(Rows.Count, "K").End(xlUp).Row
  4. If Rw <= 2 Then Exit Sub
  5. '測試其中一個客戶的下單數...全都
  6. [q2] = "=SUMIFS(網單.全都!$I:$I,網單.全都!$C:$C,BF理貨!$D2," & _
  7. "網單.全都!$K:$K,BF理貨!$C2)+IF(BF理貨!$R$283=BF理貨!$B$283,BF理貨!$R2,0)"
  8. For Each xR In Range("K2:K" & Rw)
  9.     If xR = "品名" Then Set xH = xR(2, 7): c = 1: GoTo 101
  10.     If xR = "合計" Then
  11.        If c = 0 Then GoTo 101
  12.        With Range(xH, xR(0, 7)) 'Q欄填入公式
  13.             .FormulaR1C1 = [q2].FormulaR1C1
  14.             .Value = .Value
  15.             .Replace 0, "", 1  '*****(1,完全符合)
  16.        End With
  17.        c = 0
  18.     End If
  19. 101: Next
  20. [q2] = "訂購數"
  21. End Sub
複製代碼
問題如下:   理貨單_訂購數.rar (81.02 KB)
a) Q欄的訂購數,是客戶下單的數量,收到訂單的時間都不是同時的
b) 客戶訂單名稱區分在A欄,客戶的訂單格式都不相同,所以6個客戶有6個公式抓取資料
c) 我修改了之前的一個程式,用來抓取Q欄的訂購數,但程式不是專為這個而設計,所以下一個客戶的訂單,會把前一訂單數給覆蓋
d) R欄的加減數量,是因應客戶有訂單"加量" or "減量"的需求而設,有時客人會在下單幾天前就告知,但不會修改當日訂單,所以需要用到R欄的"加減數量",
可以預先key入,但時間未到時則不予計入!
e) 請問要如何修改程式,可以將A欄名稱(客戶)列入程式中,讓不同時間下單的6個客戶,各自的訂單數不會被覆蓋?
''----------A欄名稱1) 全都
[q2] = "=SUMIFS(網單.全都!$I:$I,網單.全都!$C:$C,BF理貨!$D2," & _
"網單.全都!$K:$K,BF理貨!$C2)+IF(BF理貨!$R$283=BF理貨!$B$283,BF理貨!$R2,0)"
''----------A欄名稱2) 統統
[q2] = "=SUMIFS(網單.統統!$R:$R,網單.統統!$M:$M,BF理貨!$D2,網單.統統!$AC:$AC,BF理貨!$C2," & _
"網單.統統!$AE:$AE,BF理貨!$B$1)+IF(BF理貨!$R$1=BF理貨!$B$1,BF理貨!$R2,0)"
''----------A欄名稱3) 德QQK
'    [q2] = "=SUMIF(網單.德QQK!$E:$E,BF理貨!$D2,網單.德QQK!$G:$G)+IF(BF理貨!$R$388=BF理貨!$B$388,BF理貨!$R2,0)"
'''----------A欄名稱4) M社
'    [q2] = "=SUMPRODUCT((網單.M社!$R$2:$R$300=BF理貨!$D2)*(網單.M社!$AP$2:$AP$300))+IF(BF理貨!$R$561=BF理貨!$B$561,BF理貨!$R2,0)"
'''----------A欄名稱5) 得來
'    [q2] = "=SUMIFS(網單.得來!$L:$L,網單.得來!$H:$H,BF理貨!$D2,網單.得來!$O:$O,BF理貨!$C2)+IF(BF理貨!$R$420=BF理貨!$B$420,BF理貨!$R2,0)"
'''----------A欄名稱6) W康
'    [q2] = "=SUMPRODUCT((網單.W康!$C$6:$C$298=BF理貨!$D2)*(網單.W康!$D$6:$D$298))+IF(BF理貨!$R$508=BF理貨!$B$508,BF理貨!$R2,0)"

TOP

回復 77# PJChen

不研究公式是對或錯, 也沒法驗證, 照抄!!! 若有誤自行去修改  

Sub 理貨訂購量()
Dim Rw&, xR As Range, xD, xH As Range, c$, Fx$
Rw = Cells(Rows.Count, "K").End(xlUp).Row
If Rw <= 2 Then Exit Sub
Set xD = CreateObject("Scripting.Dictionary")
xD("全都") = "=SUMIFS(網單.全都!$I:$I,網單.全都!$C:$C,BF理貨!$D2," & _
           "網單.全都!$K:$K,BF理貨!$C2)+IF(BF理貨!$R$283=BF理貨!$B$283,BF理貨!$R2,0)"
xD("統統") = "=SUMIFS(網單.統統!$R:$R,網單.統統!$M:$M,BF理貨!$D2,網單.統統!$AC:$AC,BF理貨!$C2," & _
          "網單.統統!$AE:$AE,BF理貨!$B$1)+IF(BF理貨!$R$1=BF理貨!$B$1,BF理貨!$R2,0)"
xD("德QQK") = "=SUMIF(網單.德QQK!$E:$E,BF理貨!$D2,網單.德QQK!$G:$G)+IF(BF理貨!$R$388=BF理貨!$B$388,BF理貨!$R2,0)"
xD("M社") = "=SUMPRODUCT((網單.M社!$R$2:$R$300=BF理貨!$D2)*(網單.M社!$AP$2:$AP$300))+" & _
           "IF(BF理貨!$R$561=BF理貨!$B$561,BF理貨!$R2,0)"
xD("得來") = "=SUMIFS(網單.得來!$L:$L,網單.得來!$H:$H,BF理貨!$D2,網單.得來!$O:$O,BF理貨!$C2)" & _
           "+IF(BF理貨!$R$420=BF理貨!$B$420,BF理貨!$R2,0)"
xD("W康") = "=SUMPRODUCT((網單.W康!$C$6:$C$298=BF理貨!$D2)*(網單.W康!$D$6:$D$298))+" & _
           "IF(BF理貨!$R$508=BF理貨!$B$508,BF理貨!$R2,0)"

For Each xR In Range("K2:K" & Rw)
    If xR = "品名" Then Set xH = xR(2, 7): c = Range("A" & xR.Row): GoTo 101
    If xR = "合計" Then
       Fx = xD(c)
       If c = "" Or Fx = "" Then GoTo 101
       [Q2].Formula = Fx
       With Range(xH, xR(0, 7)) 'Q欄填入公式
            .FormulaR1C1 = [Q2].FormulaR1C1
            .Value = .Value
            .Replace 0, "", 1  '*****(1,完全符合)
       End With
       c = ""
    End If
101: Next
[Q2] = "訂購數"
End Sub


======================================

TOP

回復 78# 准提部林

准大,
又來麻煩您了....
程式雖然來回查找,應該說測試了幾天,但沒有一次可以運作成功!就是找不到問題點...
我放上2個訂單,我想這2個可以運作的話,其他的應該就不會有問題了,
函數方面確定無誤,這是每天必做的功課,運行OK.   理貨單_訂購數.rar (373.36 KB)

TOP

回復 79# PJChen

改下:
If xR = "品名" Then Set xH = xR(2, 7): c = Range("A" & xR.Row + 1).Value: GoTo 101

TOP

        靜思自在 : 生氣,就是拿別人的過錯來懲罰自己。
返回列表 上一主題