質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

4675閲覧

VBA:空白セルに、上の行のセルに入力されている同じ値を埋めていく方法

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/01/31 03:52

添付図のようなデータを取り込んだExcelデータがあります。
イメージ説明
添付のように、
やりたいこと1:空欄となっているA,B列の行を自動的に上のセルの内容で埋めて、
やりたいこと2:空白が埋まったら値が入っている最下行の1つ下の行から新しいデータを取り込むようなマクロを組みたいのですが、うまくいきません…

Option Explicit Sub データ読込() '転記元ファイルの取得用変数 Const FILE_PATH = "C:あいうえお" Dim sFileName As String '転記元のシートの変数 Dim copyWb As Excel.Workbook Dim copyWs As Excel.Worksheet '転記先のシートの変数 Dim pasteWs As Excel.Worksheet '出力行 Dim iPasteRow As Integer '転記先のシートを取得 'マクロが書かれているブックの、アクティブなシート Set pasteWs = Excel.ThisWorkbook.ActiveSheet '出力する空白セルの指定 Dim pasteCell As Excel.Range Set pasteCell = pasteWs.Cells(pasteWs.Rows.Count, "A").End(xlUp).Offset(1) '出力行を取得(先頭行) iPasteRow = pasteCell.Row ソースコード途中省略          With pasteWs Dim a As String Dim r As Range a = "A2:B" & Range("C" & Format(Rows.Count)).End(xlUp).Row For Each r In Range(a) If r.Value = "" Then r.Value = r.Offset(-1, 0).Value Next End With 'pasteWs '空白も埋まったらデータ取り込みのため、行を1行下に進める iPasteRow = iPasteRow + 1 End If

マクロを実行すると、空白は埋まらず、A列の値が入っている次の行から一行ずつ新しいデータを取り込んでしまいます。
過去にも同じような質問をさせていただいており、恐縮ですが、
いまいちどうソースコード組みなおせばよいのかわかりません。

どうかお助けください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Range、Rows、Columns、Cells、いずれも頭に「pasteWs.」を付けなければ、
自動的に ActiveSheet が参照されます。

なので、システム開発的な目線からは必須です。

折角「With pasteWs」としていても、
ご自身が意味を分かって使ってなければ、
無意味なバグを引き起こして
不要な時間を過ごすことになります。

余談ながら、With ~ End With の「~」部分のコードは、
インデントを下げると見やすいと思いますし、
With をかけている、という事を意識しやすいです。

投稿2018/01/31 05:48

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 06:34

ありがとうございます。 Range、Rows、Columns、Cells、いずれも頭に「pasteWs.」を付けなければ、 自動的に ActiveSheet が参照されます。 =>withをつけたらすべて適用されると思っていたので、ご指摘くださり理解に助かりました。 試してみます。
ExcelVBAer

2018/01/31 06:52

With の範囲では、.Range の様に、[.]から記述できます。 この[.]の前には、「pasteWs」があるという事になり、「pasteWs」を省略できます。 それが With の意味です。
ExcelVBAer

2018/01/31 06:55

余談ですが、「Format(Rows.Count)」の Format は不要では? 文字列型に変換させるだけなら、Cstr を使うべきです。
退会済みユーザー

退会済みユーザー

2018/02/02 01:54

追加のアドバイス誠にありがとうございます。 まだうまく実行できていないので自力で理解できず恐縮なのですが、 いただいた最後から2つ前のアドバイスは下記のようにソースコードを記述するという理解であってるでしょうか?      With pasteWs Dim a As String Dim r As Range a = "A2:B" & .Range("C" & Format(Rows.Count)).End(xlUp).Row For Each r In .Range(a) If r.Value = "" Then r.Value = r.Offset(-1, 0).Value Next End With 'pasteWs
退会済みユーザー

退会済みユーザー

2018/02/02 01:56

もう一つのアドバイスもありがとうございます。 文字列は、Cstrとformatとstringで3つの関数を使い分ける必要があるということなのでしょうか?? 今回の場合は、日付のような表示設定をしていないので、Cstrという関数を使うべきということでしょうか??
ExcelVBAer

2018/02/02 02:13

Withの使い方、あってます。 ただ、正確には「Rows」も「.Rows」とすべきです。 (稀なケースかもしれませんが、xlsとxlsx が混在している場合でエラーになる可能性が考えられます)
ExcelVBAer

2018/02/02 02:15

使い分ける必要、とも言えるかもしれませんが、 正確な使い方をすべき、という話ですね。 Format、CStr、String関数について、 各関数がどういう処理の為の関数なのか調べれば分かると思います。
退会済みユーザー

退会済みユーザー

2018/02/02 03:31

早速のご回答ありがとうございます。 場所を具体的に指示することが大事だったのですね。 型と関数などまだまだ理解がごっちゃなので、引き続き調べてみたいと思います。 アドバイスありがとうございました!
guest

0

ベストアンサー

pasteWs.Range("C1").End(xlDown).Row
の方が良いかと。
空欄となっているA,B列の行を自動的に上のセルの内容で埋めるのであれば
下記のようなコードでも実現可能です。ご参考までに。

VBA

1Dim I As Integer 2Dim intEndRow as Integer 3 4intEndRow = pasteWs.Range("C1").End(xlDown).Row 5For I = 2 to intEndRow 6 If Nz(pasteWs.Range("A" & I-1),"")<>"" AND Nz(pasteWs.Range("A" & I),"")="" then 7 pasteWs.Range("A" & I)=pasteWs.Range("A" & I-1) 8 End if 9 If Nz(pasteWs.Range("B" & I-1),"")<>"" AND Nz(pasteWs.Range("B" & I),"")="" then 10 pasteWs.Range("B" & I)=pasteWs.Range("B" & I-1) 11 End if 12Next

投稿2018/01/31 06:01

Mustang32861341

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 06:42

ありがとうございます! Ifの次のNzはどういう意味なのでしょうか?? NzはDimの文章を書かなくてよいのでしょうか?
Mustang32861341

2018/01/31 06:49

すみません、癖でAccessの関数を記述してしまいました。 If pasteWs.Range("A" & I-1)<>"" AND pasteWs.Range("A" & I)="" then で問題ないです。
退会済みユーザー

退会済みユーザー

2018/02/02 01:58

ご返信ありがとうございました。 Accessはさわったことがなかったのですが、エクセルよりAccessをこのような複数のデータをまとめて分析する場合は使ったほうがよかったのでしょうか??
退会済みユーザー

退会済みユーザー

2018/02/02 02:04

まだうまく実行ができずにおりまして、追加のヒントを賜れますと幸いです。 「実行時エラー424:オブジェクトが必要です」が表示され、 intEndRow = pasteWs.Range("C1").End(xlDown).Row が黄色くハイライトされます。 C1を他のセルを指定してみても、同じエラーが出てしまいます。
Mustang32861341

2018/02/02 02:05

運用目的にもよりますので一概には言えませんが、例えば複数のPCで入力して集計したい場合や マスタを作成し、入力・管理を厳格化したい場合などはAccessのほうが良いと思います。
Mustang32861341

2018/02/02 02:13

pasteWs の適用範囲外に記述していませんか?
退会済みユーザー

退会済みユーザー

2018/02/02 02:15

あ!オブジェクトは、このマクロを実行するシートのことですね!! うまく実行でき、一気に空白に入れたい値が入力されていきました!! 一個前のコメントは無視くださいませ。失礼いたしました! ご教示ありがとうございます。大変助かりました。
退会済みユーザー

退会済みユーザー

2018/02/02 02:23

早速のご返信ありがとうございます。 Accessというアプリ知らなかったので、勉強してみようと思います。 教えてくださりありがとうございます。 なお、実行できたのですが、次のコードがよく内容が理解できていません。 理解があっていますでしょうか? intEndRow = pasteWs.Range("C1").End(xlDown).Row →現在データが入っている最終行を探す。(今回の場合は、C列に値が下まで入っているので、その最終行のを探す。) For I = 2 To intEndRow →2がなぜなのかと、intEndRowとIの違いがよくわかりません。 度々の質問恐縮です。 理解のヒントいただければ幸いです。
guest

0

別のシート(ブック?)のA・B列を埋めに行っていませんか?

Range("C" & Format(Rows.Count)).End(xlUp).Row
をウォッチ式に入れるなどして、値を確認してみて下さい。

慣れない構文なので確信は持てませんが
With pasteWs が機能していないような……?

投稿2018/01/31 04:26

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 04:39

ありがとうございます。 ご指摘のとおり、さっぱり機能していないようです。
guest

0

VBAのマクロを組む場合、マクロの記録で手動実行したものを参考にすると良いと思います。私もマクロを記録して参考にして必要な部分を修正して組んでいました。

投稿2018/01/31 04:08

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 04:38

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問