[[20190406111714]] 『VBA 修正箇所が分かりません( ;∀;)』(ことり) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row
>LastRow = Worksheets("出荷伝票").Cells(AllRow, 1).End(xlUp).Row + 1

同じ変数でよいのでしょうか?

(マナ) 2019/04/06(土) 11:59


色々、弄って自分の思う結果が出るように変更していたのであまりよく理解で来ていません。
何か変な構成があれば指摘か変更内容も教えてください!
(ことり) 2019/04/06(土) 12:02

>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row

この LastRow は、何なのでしょうか。教えていただけますか。
名前から推測すると、なにかの最終行のようですが。

(マナ) 2019/04/06(土) 12:17


Cells(AllRow, 1).End(xlUp).Row の部分で、最終行の1列目から上方向に移動して、初めてデータがあるセルの行を取得しています。

らしです…((+_+))
(ことり) 2019/04/06(土) 12:25


>初めてデータがあるセルの行を取得しています。

それは、どのシートの行ですか?

(マナ) 2019/04/06(土) 12:30


出荷リストと出荷伝票のシートで上に項目名を入力しています。
その項目名の下から順に転記されるようにしています!
(ことり) 2019/04/06(土) 12:49

>LastRow = Worksheets("出荷リスト").Cells(AllRow, 1).End(xlUp).Row

今は、この部分についてだけ質問しています。

>最終行の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


よく理解していません・・・
何となく、1番上の入力されていないセル。って思っています(´・ω・`)
(ことり) 2019/04/06(土) 14:38

>よく理解していません・・・
>何となく、1番上の入力されていないセル。って思っています(´・ω・`)

たぶんマナさんのおっしゃってることがよくわかっていらっしゃらないのだとおもいますのでそこをお手伝い。
https://www.239-programing.com/excel-vba/basic/basic023.html
https://asatte.biz/vba-debug-menu/

あと、質問サイトで顔文字は極力やめたほうがいいですよ。
人によってはふざけていると捉えて回答をやめる場合があります。

(もこな2) 2019/04/06(土) 14:49


もこな2さん。
そうですよね…
気をつけます。アドバイスをわざわざありがとうございます。

マナさん。
私はそんなつもりは無かったんですがごめんなさい。
教えてもらった内容で頑張ってみます。
ここまで付き合ってもらったので完成させてみせます!

お二人共ありがとうございました!
(ことり) 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

>一つの変数 LastRow で使い回すことは出来ない
まぁ言ってしまえばそうなんでしょうけど、たぶん何が格納されているか理解できてないっぽい気がします。

とりあえず演習問題置いておきます。

    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


syさん。
大変助かります!
色々、調べてみましたが心が挫けそうでした、、、
わざわざ、まとめてくださりありがとうございます!
私なりに頑張ってみます✨
(ことり) 2019/04/08(月) 08:16

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.