[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA 修正箇所が分かりません( ;∀;)』(ことり)
初めまして!
エクセルで伝票を作っています。
VBAでどこをどう直せばいいのか見てもらえないでしょうか。
ネットで色々拾っては繋いで変更して。と繰り返しているうちに脳内回路がパンクしてしまいました(>_<)
・入力シートに数値を入れて登録ボタンで出荷リストシートに転記します。
・同時に出荷伝票のシートにも転記します。
・出荷伝票はその日の分が終わるとプリントアウトして一度全部消去します。
・出荷リストは在庫表にリンクしているので累積させていきたいです。
問題は出荷伝票をクリアすると次回はちゃんと表の上から転記されていくのですが、同時に出荷リストの方も上からになってしまい前回分の内容に上書きされてしまします。
多分、構成に不備があると思うのですがどこを変更すればいいのか見てください(>_<)
Sub
Dim AllRow As Long
Dim LastRow As Long
AllRow = ActiveSheet.Rows.Count
LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row
LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1
Worksheets("出荷リスト").Cells(LastRow, 1) = LastRow - 3
Worksheets("出荷リスト").Cells(LastRow, 3) = Worksheets("入力").Cells(4, 3)
Worksheets("出荷リスト").Cells(LastRow, 4) = Worksheets("入力").Cells(5, 3)
Worksheets("出荷リスト").Cells(LastRow, 5) = Worksheets("入力").Cells(6, 3)
Worksheets("出荷リスト").Cells(LastRow, 6) = Worksheets("入力").Cells(7, 3)
Worksheets("出荷リスト").Cells(LastRow, 7) = Worksheets("入力").Cells(8, 3)
Worksheets("出荷リスト").Cells(LastRow, 8) = Worksheets("入力").Cells(9, 3)
Worksheets("出荷伝票").Cells(LastRow, 1) = LastRow - 4
Worksheets("出荷伝票").Cells(LastRow, 1) = Worksheets("入力").Cells(4, 3)
Worksheets("出荷伝票").Cells(LastRow, 2) = Worksheets("入力").Cells(5, 3)
Worksheets("出荷伝票").Cells(LastRow, 3) = Worksheets("入力").Cells(7, 3)
Worksheets("出荷伝票").Cells(LastRow, 4) = Worksheets("入力").Cells(8, 3)
Worksheets("出荷伝票").Cells(LastRow, 8) = Worksheets("入力").Cells(9, 3)
Worksheets("出荷リスト").Cells(LastRow, 3).NumberFormatLocal = "yyyy/m/d"
Worksheets("入力").Range("C4:C5").ClearContents
Worksheets("入力").Range("C7:C9").ClearContents
Range("C4").Select
End Sub
です!
セル等の詳細は関係ないと思うので特に記載してないですが、この内容で大丈夫ですか…?
どうか助けてください!
< 使用 Excel:Excel2016、使用 OS:Windows10 >
同じ変数でよいのでしょうか?
(マナ) 2019/04/06(土) 11:59
この LastRow は、何なのでしょうか。教えていただけますか。
名前から推測すると、なにかの最終行のようですが。
(マナ) 2019/04/06(土) 12:17
らしです…((+_+))
(ことり) 2019/04/06(土) 12:25
それは、どのシートの行ですか?
(マナ) 2019/04/06(土) 12:30
今は、この部分についてだけ質問しています。
>最終行の1列目から上方向に移動して、初めてデータがあるセルの行を取得しています。
この回答では、シートがわからないので、
どのシートの話なのかを教えていただけますか。
(マナ) 2019/04/06(土) 12:57
これで分かりますか?
私の回答が的違いで申し訳ないです( ;∀;)
(ことり) 2019/04/06(土) 13:34
>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row
ことりさんが、この1行の意味を正しく理解できているか確認しています。
それによって、問題点に気がついてもらいたいと思っています。
やりとりが、まどろっこしい、面倒だということであれば、
ステップ実行(F8)を試してはどうでしょうか。
それで、何が原因かわかると思います。
ステップ実行の方法については、ネットで検索してください。
(マナ) 2019/04/06(土) 13:55
たぶんマナさんのおっしゃってることがよくわかっていらっしゃらないのだとおもいますのでそこをお手伝い。
https://www.239-programing.com/excel-vba/basic/basic023.html
https://asatte.biz/vba-debug-menu/
あと、質問サイトで顔文字は極力やめたほうがいいですよ。
人によってはふざけていると捉えて回答をやめる場合があります。
(もこな2) 2019/04/06(土) 14:49
マナさん。
私はそんなつもりは無かったんですがごめんなさい。
教えてもらった内容で頑張ってみます。
ここまで付き合ってもらったので完成させてみせます!
お二人共ありがとうございました!
(ことり) 2019/04/06(土) 15:00
ケースバイケースだと思いますが、回りくどい気がするなぁ。
最終行番号の管理は、シート毎に行わないとマズいので、一つの変数 LastRow で使い回すことは出来ない、 と言えば済む話なんじゃないですかねぇ。
(半平太) 2019/04/06(土) 15:14
>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row LastRow にはシート("出荷リスト")の最終行(ex 30)が入ります。 >LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1 続いて、 LastRow にはシート("出荷伝票")の最終行(ex 5)が入ります。 〜〜〜〜〜〜〜〜〜 この状態で Worksheets("出荷リスト").Cells(LastRow, 1) = LastRow - 3 が実行されると Worksheets("出荷リスト") の Cells(LastRow, 1) に LastRow - 3 がセットされるわけですが、 Cells(LastRow, 1) の LastRow って、シート("出荷伝票")の最終行(ex 5) になりますよね。 〜〜〜〜〜〜〜〜〜 出荷リストシートも、出荷伝票のシートも各々最終行を求める必要はあるんですが、 じゃあ >LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1 の行は、どの位置にあるべきなんだろう...
と考えて見られたら如何ですか?
(チオチモリン) 2019/04/06(土) 15:37
チオチモリンさん。
何かすいません。よく理解出来てないです。
LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1 この1文の場所が悪いって事なのかな?
内容うんぬんぢゃなくて、全体の構成がおかしくしてる原因ですか?
(ことり) 2019/04/06(土) 15:52
とりあえず演習問題置いておきます。
Sub 実験() Dim tmp As Long
'▼(1)tmpには「どのシート」の「どの列」の「何」が入りますか tmp = Worksheets("出荷リスト").Cells(Rows.Count, 1).End(xlUp).Row
'▼(2)tmpには「どのシート」の「どの列」の「何」が入りますか tmp = Worksheets("出荷伝票").Cells(Rows.Count, 1).End(xlUp).Row + 1
End Sub
(もこな2) 2019/04/06(土) 16:15
>よく理解出来てない 理解に努めてください。
>Worksheets("出荷リスト").Cells(LastRow, 1) = LastRow - 3 Worksheets("出荷リスト").Cells(シート("出荷伝票")の最終の行, 1) = シート("出荷伝票")の最終行 - 3 でよろしいのですか? と 問題提起しています。
>内容うんぬんぢゃなくて、全体の構成がおかしくしてる原因ですか? 意味がよくわかりませんが、デバッグの基本は他人に指摘されるものではなくて、自分で見つけるものです。 意図と異なる結果になるときは、多々(コードは正しいという)思い込みがデバッグの邪魔をしますから 一行一行、このコードは何をしているんだよと、他人に説明するつもりで口に出して説明してみてください。 その過程で間違いに気づくことは多いです。 (チオチモリン) 2019/04/06(土) 16:41
すでに、チオチモリンさんがコメントされていますが、コードの理解やデバッグ作業は自分でやるものですよ。(方法は回答済み。)
ちなみに、お行儀は良くないですが、順番に気を付ければLastRowは使いまわしできます。
Sub 名無しのごんべい() Stop ' ← ブレークポイントのかわり
Dim LastRow As Long Dim srcSH As Worksheet Set srcSH = Worksheets("入力")
With Worksheets("出荷リスト") LastRow = .Cells(Rows.Count, "A").End(xlUp).Row ' ← 【+1】 が抜けてないか?
.Cells(LastRow, 1).Value = LastRow - 3
srcSH.Range("C4:C9").Copy .Cells(LastRow, "C").PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Cells(LastRow, "C").NumberFormatLocal = "yyyy/m/d" End With
With Worksheets("出荷伝票") LastRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
'.Cells(LastRow, 1) = LastRow - 4 ←意味がない(次の行を実行すると上書きされる) .Cells(LastRow, 1).Value = srcSH.Cells(4, 3).Value .Cells(LastRow, 2).Value = srcSH.Cells(5, 3).Value .Cells(LastRow, 3).Value = srcSH.Cells(7, 3).Value .Cells(LastRow, 4).Value = srcSH.Cells(8, 3).Value .Cells(LastRow, 8).Value = srcSH.Cells(9, 3).Value End With
With Worksheets("入力") .Range("C4:C5").ClearContents .Range("C7:C9").ClearContents Application.Goto .Range("C4") End With
End Sub
※テスト環境を用意するのがめんどくさいので未テストですが、コンパイルが通るかはチェックしてあります。
(もこな2) 2019/04/06(土) 16:57
とりあえず、皆さんに提示して頂いた内容ややり方、理解し方を試してみます。
ありがとうございました。
(ことり) 2019/04/06(土) 17:56
色々指摘を受けて混乱してますね。 一度今までの全ての回答は忘れて、先ずは以下で変数の意味を理解して下さい。
http://www.officetanaka.net/excel/vba/variable/01.htm
初めの10行分くらいを読んでください。
http://www.officetanaka.net/excel/vba/variable/07.htm
上記リンクは今回の事だけに必要そうな項目だけをピックアップしてますが、 理解が進んだら、変数に関する事の全文にも目を通しましょう。 http://www.officetanaka.net/excel/vba/variable/index.htm
要は「1つの変数に、値は1つしか格納出来ないよ。」と言う事だけが言いたいんですけどね。
上記が理解できれば、初めのマナさんの >>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row >>LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1 >同じ変数でよいのでしょうか? この問いかけや、
半平太さんの >最終行番号の管理は、シート毎に行わないとマズいので、一つの変数 LastRow で使い回すことは出来ない、 この説明も理解できると思います。
後これもおかしいです。 >Worksheets("出荷伝票").Cells(LastRow, 1) = LastRow - 4 >Worksheets("出荷伝票").Cells(LastRow, 1) = Worksheets("入力").Cells(4, 3) 此方は変数では無いですけど、同じセルに違う値を順番に入力してますけど、
先ずこれが分かれば他の方の回答も徐々に理解できると思います。
(sy) 2019/04/07(日) 08:34
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.