- ベストアンサー
秀和システム「Excel VBAプログラミングのツボとコツが絶対に分かる本」で学ぶ請求書作成プログラムの仕組みとは?
- 販売シートから請求先を選び、各会社別の請求書を作成するプログラムの仕組みについて教えてください。
- 特に、請求書の金額の項目に単価と数量を掛ける式を自動で入れる部分について説明してください。
- また、請求書の作成順序やプログラムの処理の流れについても教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- ExcelVBAテキストでの疑問
Option Explicit Sub 請求書作成(Kokyaku As String) '引数「Kokyaku」は請求書を作成する顧客名 ここだけなぜ「請求書作成」、引数を宣言するのかが不明です。 Dim i As Integer '「販売」ワークシートの表の処理用カウンタ変数 Dim Cnt As Integer '請求書のワークシートの表の処理用変数 Cnt = 12 '請求書のワークシートの表の先頭行(12行目)の値に初期化 'ワークシート「請求書雛形」を末尾にコピー Worksheets("請求書雛形").Copy After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Kokyaku 'ワークシート名を設定 Worksheets(Kokyaku).Range("A6").Value = Kokyaku '請求書の宛先を設定 Worksheets(Kokyaku).Range("E2").Value = Date '請求書の発行日を設定 '指定した顧客の販売データを請求書へコピー For i = 4 To 32 If Worksheets("販売").Cells(i, 2).Value = Kokyaku Then Worksheets(Kokyaku).Cells(Cnt, 1).Value = Worksheets("販売").Cells(i, 1).Value '日付 Worksheets(Kokyaku).Cells(Cnt, 2).Value = Worksheets("販売").Cells(i, 3).Value '商品 Worksheets(Kokyaku).Cells(Cnt, 3).Value = Worksheets("販売").Cells(i, 4).Value '単価 Worksheets(Kokyaku).Cells(Cnt, 4).Value = Worksheets("販売").Cells(i, 5).Value '数量 Worksheets(Kokyaku).Cells(Cnt, 5).Value = Worksheets("販売").Cells(i, 6).Value '金額 Cnt = Cnt + 1 '請求書のワークシートの表のコピー先の行を1つ進める End If Next i End Sub Sub フォーム用意() myForm.Show End Sub
- 締切済み
- Excel(エクセル)
- VBAプログラミングの質問です。
Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。 1 1 967 2 1 687 ……… x y 802 ……… x行、y列に802を代入するという感じです。全部で57985データあります。 前の回答を参考にして、48881データまではSheet2に For k = 1 To 48881 Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5) Next k このようにプログラムを書いて納まって、残りの57985-48881=9104データの行列はSheet2に納まらなかったので、Sheet3に書こうと思い、下のように書きましたがプログラムがうまく動きませんでした。他にも試しましたが初心者のためダメでした。 Dim n As Long Dim m As Long n = 9104 m = 48881 For k = 1 To n Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5) Next k 48881というのが大きいため動かないと考えられますが、どのように対処したらよいかわかりません。教えてください。お願いします。
- ベストアンサー
- Visual Basic
- ワークシート名を変数に格納する方法
VBA初心者です。ワークシートが5つあり各シートにデータを転記するマクロを作成したいのですがワークシート名を変数にしてループ処理することはできるのでしょうか? 下記はワークシート名"H"にだけ転記するマクロを作成してみましたがこの後がわからず悩んでいます。よろしくお願いします。 Dim データ行 As Integer Dim cnt As Integer Dim データ数 As Integer cnt = 4 データ行 = Cells(Rows.Count, 8).End(xlUp).Row For データ数 = 11 To データ行 If Worksheets("入力").Cells(データ数,1).Value= "2"Then Worksheets("H").Cells(cnt, 6).Value = Worksheets("入力").Cells(データ数, 8).Value Worksheets("H").Cells(cnt, 7).Value = Worksheets("入力").Cells(データ数, 9).Value Worksheets("H").Cells(cnt, 8).Value = Worksheets("入力").Cells(データ数, 27).Value Worksheets("H").Cells(cnt, 9).Value = Worksheets("入力").Cells(データ数, 19).Value Worksheets("H").Cells(cnt, 10).Value = Worksheets("入力").Cells(データ数, 20).Value Worksheets("H").Cells(cnt, 11).Value = Worksheets("入力").Cells(データ数, 21).Value Worksheets("H").Cells(cnt, 12).Value = Worksheets("入力").Cells(データ数, 10).Value Worksheets("H").Cells(cnt, 13).Value = Worksheets("入力").Cells(データ数, 11).Value Worksheets("H").Cells(cnt, 14).Value = Worksheets("入力").Cells(データ数, 22).Value Worksheets("H").Cells(cnt, 15).Value = Worksheets("入力").Cells(データ数, 23).Value cnt = cnt + 1 End If Next データ数
- ベストアンサー
- その他([技術者向] コンピューター)
- vbaプログラミングについて教えてください。
vba初心者です。下記のようにプログラミングしましたがもっといいプログラムの仕方はないでしょうか。ちょっとごちゃごちゃしていて見にくいです。どなかたお力をお貸しください。 Private Sub データUPDATE輸入_Click() ActiveSheet.Unprotect Dim Line As String Dim Maxrow As String Sheets("Invoice").Select Line = 5 Do Until Cells(Line, 7).Value = "" On Error Resume Next 'A列の空欄をコピーして埋める If Cells(5, 1).Value = "" Then Cells(Line, 1).Value = "" ElseIf Cells(Line, 1).Value = "" Then Cells(Line, 1).Value = Cells(Line - 1, 1).Value End If 'B列の空欄をコピーして埋める If Cells(5, 2).Value = "" Then Cells(Line, 2).Value = "" ElseIf Cells(Line, 2).Value = "" Then Cells(Line, 2).Value = Cells(Line - 1, 2).Value End If 'C列の空欄をコピーして埋める If Cells(5, 3).Value = "" Then Cells(Line, 3).Value = "" ElseIf Cells(Line, 3).Value = "" Then Cells(Line, 3).Value = Cells(Line - 1, 3).Value End If 'D列の空欄をコピーして埋める If Cells(5, 4).Value = "" Then Cells(Line, 4).Value = "" ElseIf Cells(Line, 4).Value = "" Then Cells(Line, 4).Value = Cells(Line - 1, 4).Value End If 'E列の文字を「輸入シート」から検索しF列に貼り付ける If Cells(Line, 5).Value = "" Then Cells(Line, 5).Value = Cells(Line - 1, 5).Value End If Cells(Line, 6).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 2, 0) 'E列を検索しデータが存在しない場合はF列に「データがありません」を表記 If Cells(Line, 6).Value = "" Then Cells(Line, 6).Value = "データがありません" GoTo コピー貼り付け End If コピー貼り付け: If Cells(Line, 6).Value = "データがありません" Then Cells(Line, 5).Copy 'コピーする Maxrow = Worksheets("輸入Parts").Range("A1").End(xlDown).Row + 1 Worksheets("輸入Parts").Range("A" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If 'H列の空欄をコピーして埋める If Cells(5, 12).Value = "" Then Cells(Line, 12).Value = "" ElseIf Cells(Line, 12).Value = "" Then Cells(Line, 12).Value = Cells(Line - 1, 12).Value End If 'E列の文字を「輸入シート」から検索しZ列に貼り付ける Cells(Line, 26).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 3, 0) 'E列を検索しデータが存在しない場合はZ列に「データがありません」を表記 If Cells(Line, 26).Value = "" Then Cells(Line, 26).Value = "データがありません" End If 'AD列の空欄をコピーして埋める If Cells(5, 30).Value = "" Then Cells(Line, 30).Value = "" ElseIf Cells(Line, 30).Value = "" Then Cells(Line, 30).Value = Cells(Line - 1, 30).Value End If 'E列の文字を「輸入シート」から検索しAM列に貼り付ける Cells(Line, 39).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 18, 0) 'E列を検索しデータが存在しない場合はAM列に「データがありません」を表記 If Cells(Line, 39).Value = "" Then Cells(Line, 39).Value = "データがありません" End If '「Unit price」の計算・円建と外貨建が合わさったインボイスの場合の合計金額 If Cells(Line, 14).Value = "" Then Cells(Line, 13).Value = Cells(Line, 17).Value * Cells(Line, 33).Value / Cells(Line, 7).Value Else Cells(Line, 17).Value = Application.WorksheetFunction.RoundDown(Cells(Line, 14).Value * Cells(Line, 16), 0) Cells(Line, 15).Value = Cells(Line, 16).Value * Cells(Line, 33).Value / Cells(Line, 7).Value End If 'T.Invoice Priceの計算 Cells(Line, 23).Value = Application.WorksheetFunction.Sum(Cells(Line, 17), Cells(Line, 18), Cells(Line, 19), Cells(Line, 20), Cells(Line, 21), Cells(Line, 22)) 'VLOOKUP関数が終わり、エラーが発生したら止まる On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop End Sub
- 締切済み
- Visual Basic
- EXCEL・VBAに関する質問です。
EXCELで或るセルに数式を代入したい場合、普通は Worksheets("xx").Range("F1").Formula = "=CONCATENATE($A$1,$C$1)" と書けば好いと思いますが、 =CONCATENATE("請求_",$D$1,".xlsm") と代入したい場合、どう書いたら好いのでしょうか。よろしくお願いします。 ちなみに私は dim seikyuu , exten as string seikyuu = "請求_" exten = ".xlsm" Worksheets("xx").Range("F2").Formula = "=CONCATENATE(" & seikyuu & ",$D$1," & exten & ")" としたら好いかと思うのですが、考え方は合っているでしょうか。
- ベストアンサー
- オフィス系ソフト
- 【Excel】【VBA】 効率の良いカウント処理について
以下(1)のようなデータがあります。※実際はもっと項目数は多いです。 (1)を元に、別シートに(2)のような集計を出したいのですが、 数式を埋め込みたくないため、VBAでカウントさせて実データを埋め込みたいです。 (1) A B | 名前 | 出身 | ├────┼────┤ | 田中 | 岩手 | | 吉田 | 秋田 | | 井上 | 沖縄 | | 加藤 | 島根 | | 鈴木 | 岐阜 | | 木本 | 愛知 | | 伊藤 | 沖縄 | | 宮田 | 秋田 | | 佐藤 | 長野 | ↓↓↓ (2) A B | 出身 | 人数 | ├────┼────┤ | 岩手 | 1 | | 秋田 | 2 | | 沖縄 | 2 | | 島根 | 1 | | 岐阜 | 1 | | 愛知 | 1 | | 長野 | 1 | そこで以下のように書いてみたところ、正しくカウントは取れるのですが、 思った以上に処理時間がかかってしまいました。 Dim dc1 As Integer Dim dc2 As Integer dc1 = Worksheets("Sheet1").Range("A65536").End(xlUp).Row dc2 = Worksheets("Sheet2").Range("A65536").End(xlUp).Row i1 = 0 i2 = 0 For i1 = 2 To dc2 cnt = 0 For i2 = 2 To dc1 If Worksheets("Sheet2").Cells(i1, 1) = Worksheets("Sheet1").Cells(i2, 1) Then cnt = cnt + 1 End If Next i2 Worksheets("Sheet2").Cells(i1, 2) = cnt cntRec = cntRec + 1 Application.StatusBar = "件数処理実行中・・・(現在 " & cntRec & "件)" Next i1 (1)を元に(2)のような表を作成するのに、もっと処理時間が短くなるような 書き方はありますでしょうか?よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
- EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのです
EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのですが、どのように行えばいいのでしょうか? Sheet1のA1からA300まで、関数によって計算されたデータが格納されています。 そのA1からA300の値(関数の計算結果のみ)を、コマンドボタンをクリックした時にSheet2のA1からA300にコピーしています。 コマンドボタンをクリックする度に、Sheet1のA1からA300までの値を、Sheet2に列を変えてコピーし、値を蓄積する方法を取っています。 以下のマクロを記述して走らせてみましたが、動作が遅いのが気になります。 コピーして貼り付けている動作が遅くなっているのでしょうか? もう少し早くなる方法はありますでしょうか? よろしくお願いします。 Sub CommandButton1_Click1() Dim I Dim N Worksheets("sheet1").Range("F1").Value = Range("F1").Value + 1 N = Worksheets("sheet1").Range("F1").Value For I = 1 To 300 Application.ScreenUpdating = False Worksheets("sheet1").Cells(I, 1).Copy Worksheets("sheet2").Cells(I, N).PasteSpecial Paste:=xlValues Application.ScreenUpdating = True Next End Sub
- ベストアンサー
- その他MS Office製品
- Excel・VBAのコード教えてください。
1シートに12ずつあるまとまりを印刷したくて下記のようなものを作成しました。 Worksheets("Sheet1").Select Last = Cells(1).CurrentRegion.Rows.Count Warizan = Abs(Last / 12) ←12個以上の場合2、3…以下は1となる。 Kaisuu = Left(Warizan, 1) For r = 1 To Kaisuu ←回数分繰り返す For i = 2 To Last ←シート1に書かれたデータの最終行まで。 Worksheets("Sheet1").Select Company = Cells(i, 1) Yuubin = Cells(i, 2) Address = Cells(i, 3) Worksheets("Sheet2").Select Select Case i Case (Kaisuu * 12) - 10 Range("D4") = Yuubin Case (Kaisuu * 12) - 9 Range("AF4") = Yuubin : Case (Kaisuu * 12) - 1 Range("AF45") = Yuubin Case (Kaisuu * 12) Range("D56") = Yuubin Case (Kaisuu * 12) + 1 Range("AF56") = Yuubin End Select Next ActiveWindow.SelectedSheets.PrintPreview Next とした時に、最終ページが2回、もしくは3回…と表示されてしまいます。 例えばデータが25個あったとして、1ページ目(12個分)が終ったらプレビュー、残りの2ページ目(1個分)を表示、としたいのです。 よろしくお願いします。
- 締切済み
- オフィス系ソフト
- エクセルVBAについて
前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。
- 締切済み
- オフィス系ソフト
- 検索型の数式が上手くできません。
1 2 A a商事 100 B b商事 200 C c商事 300 D a商事 500 E a商事 600 仕事で上記のようなデータをシートIに作成しております。 このデータを別シートへ下記のように抜き出したいのです。 1 2 A a商事 100 B a商事 500 C a商事 600 D E VLOOKUPやLOOKUPでは、上手く出来ません。(一番上の a商事 100 という値しか返さず、縦にコピーをしても同じ値が返されるだけでした。) 良い方法を教えてください。 ちなみに、シートIに作成しているデータがとても多いので、同じ検索値をA行へズラッとコピーしてその横へLOOKUPを使って値を返したのでは、とても手間がかかります。 定期的に集計をとりたいデータですので、シートIのデータが、即他のシートへ拾い出し&集計できる数式が便利なのですが、どうすればいいかわかりません。 とても困っていますので、どうか宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
n-junさんありがとうございます。 よかったです。 n-junさんには以前にも回答いただきまして、今後いろいろお世話になるかもしれません。 ありがとうございました。