• 締切済み

エクセルマクロで自動転記について

独学で手さぐりしながら学んでいますが、どうしてもうまくいかず。 アドバイス頂けないでしょうか? (1)を毎回元にして、出荷指示を作成していき、入力後保存ボタンをおすと(2)の別シートに自動転記して 月々のリストを作成していきたいのです。 知っているマクロでやろうとすると、同じデータシートに(2)がある為、(1)を開くたびにデータが消えてしまい溜まっていきません。効率の良いやり方と、もし可能であれば実現できるモジュールコード教えて頂けないでしょうか?

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.4

>ただいま、最終的に行いたい図を添付しましたので >一度、ご確認いただけますでしょうか? 添付画像確認致しました。 画像からは列番号(記号)/行番号が読み取れないので具体的なコードは記述できません。 また、図1と図2の様式については一致している項目が「納入先」、 近そうな項目が「LOT」「lot No」、「品名」「銘柄」、「数量」「個数」、 新規の項目が「出荷日」「荷姿」「合計」など 作業的に「転記」ではなく「集計」に近いようですが。 >現在のコードをもとにして、応用し添付画像の様に >マクロを組みたいのですが、どこを変更すれば >実現可能でしょうか? 上記(添付画像でいう黄色背景色の部分をコピーする)目的では、 ベースとするご提示して頂いている「S_書込」プロシージャでは程遠いですね。 ご提示のコードは今回の目的で作成されたものとは全くの別物でしょうか。 詳細な仕様を元に初めから作られたほうが早い気がいたしますが。 上記理由により具体案ではありませんが・・・ 今回の画像のように転々とした値を別の場所に転記する場合はコピーではなく以下のように記述します。 Worksheets("Sheet2").Range("A2") = Worksheets("Sheet1").Range("B8")  → Sheet2のA2セルにSheet1のB8セルの値を入れる まとまった範囲を代入する場合は配列変数に格納してから纏めて入れる方法もあります。 Dim myRange As Variant  → 配列変数を用意 myRange = Worksheets("Sheet1").Range("G8:L8")  → Sheet1のG8:L8セルを配列変数に格納 Worksheets("Sheet2").Range("B2:G2") = myRange  → Sheet2のB2:G2セルに配列変数を格納 セルアドレスの指定方法について、以下のコードはどれもA2セルを意味します。   Range("A2")   i=2: Range("A" & i)   Cells(2, 1)   Cells(2, "A")   Range(Cells(2, 1))   Range(Cells(2, 1).Address) No1の回答を元に最終行値を取得し上記記述方法と組み合わせて 目的のセルを対象に上記方法で個々に項目を代入する処理を淡々と記述すればよいかと思います。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

別途、セル範囲に名前の定義がされていますね。 シート様式の仕様も提示して頂いてないので、 コードより以下のように仮定致します。 (1)名前の定義において、「商品名」は"K:K"である (2)「出荷リスト」シートの1~7行は項目行であり、   コピー対象はK~W列の入力されている行を対象とする。 (3)「台帳」シートの1行目は項目行であり、   コピー内容は値でA列の最終セルの次の行に張り付ける。 上記条件ですと、(3)により以下のコードは「+ 2」である必要があります。   セル範囲 = "A" & 行 + 1      ↓   セル範囲 = "A" & 行 + 2 また、以下の処理で最終行を取得する場合はコピーされた範囲のデータは全て連続している必要があります。 行 = Worksheets("台帳").Range("A2").CurrentRegion.Rows.Count つまり、以下のデータを台帳に転記した後、次の転記処理から正常に動作しなくなります。       K    L    M   08|データ データ データ   09|    空白行     ・・・   10|データ データ データ No1で回答した内容でご提示のコードを作成し直すと以下のようになります。 (上記仮定(1)、(2)、(3)に問題が無ければ動作します) Sub S_書込() '見積データをコピー Range("K8:W" & Cells(Rows.Count, "K").End(xlUp).Row).Copy '台帳シートの最終行+1へ値として張り付け Worksheets("台帳").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues 'コピーの解除 Application.CutCopyMode = False End Sub

mint-choco
質問者

補足

ご丁寧にご回答頂きましてありがとうございます。 すみません、画像がなくわかりずらくなってしまいまして… ただいま、最終的に行いたい図を添付しましたので 一度、ご確認いただけますでしょうか? 現在のコードをもとにして、応用し添付画像の様に マクロを組みたいのですが、どこを変更すれば 実現可能でしょうか? お力をお貸し頂けないでしょうか?

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

補足にてご提示頂いたコード「書込」プロシージャでは 各プロシージャを管理しているだけのコードですので転記できていない理由が不明です。 実際に転記処理をしていると思われる 「Call S_書込」から呼び出されている「S_書込」プロシージャをご提示ください。

mint-choco
質問者

補足

Sub S_書込() '表示されている見積書データを台帳に書込みます。 '入力された行数をカウント 行 = Application.WorksheetFunction.CountA(Range("商品名")) 'コピー元(入力画面)のセル範囲文字列を作成 セル範囲 = "K8:W" & 行 + 7 '見積データをコピー Range(セル範囲).Copy '見積データを貼り付ける行の選択 行 = Worksheets("台帳").Range("A2").CurrentRegion.Rows.Count セル範囲 = "A" & 行 + 1 '見積データを貼り付け Worksheets("台帳").Range(セル範囲).PasteSpecial Paste:=xlPasteValues '値 'コピーの解除 Application.CutCopyMode = False End Sub どういう指示がなされているのか、改めて教えて頂けたら幸いです。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

現在の状態と具体的なデータの様式がご提示されていないので何とも言えませんが・・・・ 1つのブックの元となるシート(1)と、転記先のシート(2)(マクロにより新規作成?)で構成されているわけですよね? 溜まるという事はシートを次々作成(名前を重複しないように)するわけではなく、一つのシート(2)に下記がしていくという事でしょうか。 転記するデータの様式(1行なのか範囲なのか、指定セルなのか不明)が分からないため詳細は記述できません。 また、ご質問者様がVBAでどの程度まで作成できるのかが分かりませんがアドバイス程度でお答えします。 (1)シートを元として、出荷指示を入力までは手作業による入力で、 マクロの動作としては「保存ボタンを押して別のシートへ自動転記」とします。 ■シートを手軽に使用できるようにする(シートオブジェクト変数にシートを代入) Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("(1)シート") Set ws2 = Worksheets("(2)シート") このようにすることで、以降「Worksheets("(1)シート").処理」と記述するとこを、「ws1.処理」として利用できます。 ■新規出力シートの作成 VBAでシートを作成できますが、新規シートを作成するのか、作成したシートへ追加するのか判定する処理が必要なため、手軽に作成するには予め「(2)シート」を作成したうえで、上記のようにws2で作成シートを対象シートとして指定したほうが簡単です。 ■データのコピー(転記) 特定の範囲を特定セルへコピーする方法場合は以下のようになります。 ws1.Range("1:1").Copy ws2.Range("1:1")  → ws1のセル範囲「1:1」をws2のセル範囲「1:1」にコピーする 1行をコピーするだけならRangeでセル範囲を指定せずにRowsで行を指定することも出来ます。 ws1.Rows(1).Copy ws2.Rows(1)  → ws1の1行目をws2の1行目にコピーする ■現在のデータの最終行を取得 出力先のシート(2)にデータを蓄積するには、出力するたびに行番号を1ずつカウントしていく変数を用いるか、 現在入力されている行の最終行を取得して、その次の行に出力するなどの工夫が必要になります。 Dim a As Long a = ws2.Cells(Rows.Count, "A").End(xlUp).Row  → ws2のA列の最終行番号を変数aに格納します    (ws2のcell(最終行番号,A列)から「Ctrl+↑」をしたときのセルの行番号を取得) ■サンプルコード これらの処理を踏まえて Sheet1の1行目にあるデータを、Sheet2の最終行にコピーしていくマクロは以下のようになります。 (最終行を取得するため、元のデータはA列に何かしらデータが入っている必要があります) マクロ「sample」が実行されるたびに、最終行へコピーされます。 (ご質問者様のデータで動作するという意味ではありません) Sub sample() '変数を用意 Dim ws1 As Worksheet, ws2 As Worksheet Dim a As Long 'シート名を格納 Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") 'ws2の最終行番号を格納 a = ws2.Cells(Rows.Count, "A").End(xlUp).Row 'ws1の1行目をws2の最終行にコピー ws1.Rows(1).Copy ws2.Rows(a + 1) End Sub ■マクロの自動記録 VBAによるプログラミングを行う際に非常に役に立ちますので、マクロの自動記録を使用て行いたい作業を記録してみてください。 コードを改変(変数の利用や、部分的な処理を流用など)することで目的とした処理内容を手軽に作ることができるかもしれません。 ■初心者向けエクセルVBA講座 以下のようなVBA関連サイトでセル・シートの扱い方や、コピーに関して記述されている箇所を中心に探されてみてはどうでしょうか。 Excel VBA 入門講座 ttp://excelvba.pc-users.net/ Office TANAKA ttp://officetanaka.net/excel/index.htm ExcelVBA.net ttp://www.excel-vba.net/ よねさんのWordとExcelの小部屋 ttp://www.eurus.dti.ne.jp/~yoneyama/Excel/Exl-_zen.htm Excel VBA(エクセルマクロ)のTipsとサンプル - エクセルスマイル http://www.happy2-island.com/excelsmile/

mint-choco
質問者

補足

今、『出荷リスト』というシートにある『書込』と言うボタンをおすと別シートの「台帳」シート表に横並びに自動転記されるようにコード入力中なのですが、以下ご参照ください。 しかし、転記されません。 Sub 書込() '入力項目のチェック If Range("見積No.").Value = "" Or Range("作成日").Value = "" Or _ Range("LOT").Value = "" Or Range("H20").Value = "" Then MsgBox "未入力項目があります", vbExclamation, "入力エラー" Exit Sub End If Application.ScreenUpdating = False '処理区分により、台帳への書込操作を選別 Select Case Range("処理区分").Value Case "新規" Call S_書込 MsgBox "台帳へ書込みました。", vbOKOnly, SoftName Case "修正" Call S_書込 Call S_削除 Call S_並替 MsgBox "台帳へ書込みました。", vbOKOnly, SoftName Case "削除" Call S_削除 MsgBox "台帳から削除しました。", vbOKOnly, SoftName Case "照会" Exit Sub End Select Call S_クリア 'ワークシート(メニュー)を有効にする Worksheets("メニュー").Activate Application.ScreenUpdating = True End Sub

関連するQ&A

専門家に質問してみよう