- ベストアンサー
エクセル VBAについて質問です。
エクセルで下のように総量から最大200gずつに仕分ける ことはできますか? 品名 総量 頭痛薬 600g 胃腸薬 350g 風邪薬 400g ↓ ↓200gずつに仕分ける ↓ 頭痛薬 200g 頭痛薬 200g 頭痛薬 200g 胃腸薬 200g 胃腸薬 150g 風邪薬 200g 風邪薬 200g 当方、VBAについて1週間ほど考えましたが、できませんでした。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
下記。 行、列の指定やcellの指定など、実際の表の仕様に合わせてください。 activesheet対象に書いています。 Sub siwake() r1 = 5 '仕訳する表の先頭行 c1 = 2 '仕訳する表の列(B) r2 = 5 '仕訳した表の先頭行 c2 = 6 '仕訳した表の列(F) hinmei = Cells(r1, c1) While hinmei <> "" soryo = Cells(r1, c1 + 1) While soryo >= 200 soryo = soryo - 200 Cells(r2, c2) = hinmei Cells(r2, c2 + 1) = 200 r2 = r2 + 1 Wend If soryo > 0 Then Cells(r2, c2) = hinmei Cells(r2, c2 + 1) = soryo r2 = r2 + 1 End If r1 = r1 + 1 hinmei = Cells(r1, c1) Wend End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>1週間ほど考えましたが そんな大げさな問題ではなかろう。 解き方の一例 元データの頭痛薬・胃腸薬などは1行にしか現れないとして、 まず頭痛薬について順次200を引いて差がプラスなら別シートに200を書く マイナスなら差を書き、次の行(胃腸薬)対象を移す。 この繰り返し。 ーーー 標準モジュールに Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim w Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d = sh1.Range("A65536").End(xlUp).Row k = 2 'MsgBox d For i = 2 To d w = sh1.Cells(i, "B") 'MsgBox w For j = 1 To 100 Select Case w Case 0 Exit For Case Is >= 200 sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = 200 w = w - 200 k = k + 1 Case Is < 200 sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = w k = k + 1 Exit For End Select Next j p1: Next i End Sub ロジックが簡単といっても、上記コードにはVBAの経験を積まないと 使えないコードが出ているとは思う。色んな方法(コード)がありえるとは思うが上記はすっきりして無いかな。 For j = 1 To 100 の100は起こりえない数ということで使っている。
お礼
回答ありがとうございます。 VBAについて勉強したばかりだったもので、何ができるのかも わからない状態でした。 詳しく解説したくださいましてありがとうございました。
- suz83238
- ベストアンサー率30% (197/656)
とりあえず Sub xxx() c = 6 For i = 2 To 4 na = Range("A" & i).Value ku = Val(Range("B" & i).Value) s1: If ku <= 200 Then GoTo s2: Range("A" & c).Value = na Range("B" & c).Value = "200g" ku = ku - 200 c = c + 1 GoTo s1 s2: Range("A" & c).Value = na Range("B" & c).Value = ku & "g" c = c + 1 Next i End Sub
お礼
回答ありがとうございます。 VBAについては、まったく初心者でしたので、すごく参考になりました。
- FEX2053
- ベストアンサー率37% (7991/21371)
DO WHILEループの応用に過ぎない、実に簡単なプログラムですけど。 W_DATA=RANGE("A1").VALUE RANGE("B1").SELECT DO WHILE W_DATA>0 IF W_DATA<=200 THEN SELECTION.FORMULA=W_DATA ELSE SELECTION.FORMULA=200 W_DATA=W_DATA-200 SELECTION.OFFSET(1).SELECT LOOP 検証はしてませんが、こんな感じの発想でいけるはず。
お礼
回答ありがとうございます。 VBAについて勉強したばかりだったもので、何ができるのかも わからない状態でした。 このコードを参考にしてこれからもっとVBAを勉強しようと思い ます。
お礼
回答ありがとうございました。 VBAについて勉強したばかりだったもので、何ができるのかも わからない状態でした。 今回、思い切って質問してみて、VBAっていろんな事ができるん だと思いました。 親切にありがとうございました。