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

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

ただいまの
回答率

90.45%

  • VBA

    2395questions

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

  • Excel

    1974questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 4,546
退会済みユーザー

退会済みユーザー

添付図のようなデータを取り込んだ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列の値が入っている次の行から一行ずつ新しいデータを取り込んでしまいます。
過去にも同じような質問をさせていただいており、恐縮ですが、
いまいちどうソースコード組みなおせばよいのかわかりません。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/31 15:34

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

    キャンセル

  • 2018/01/31 15:52

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

    キャンセル

  • 2018/01/31 15:55

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

    キャンセル

  • 2018/02/02 10: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 10:56

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

    キャンセル

  • 2018/02/02 11:13

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

    キャンセル

  • 2018/02/02 11:15

    使い分ける必要、とも言えるかもしれませんが、
    正確な使い方をすべき、という話ですね。

    Format、CStr、String関数について、
    各関数がどういう処理の為の関数なのか調べれば分かると思います。

    キャンセル

  • 2018/02/02 12:31

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

    キャンセル

checkベストアンサー

+1

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

Dim I As Integer
Dim intEndRow as Integer

intEndRow = pasteWs.Range("C1").End(xlDown).Row
For I = 2 to intEndRow 
    If Nz(pasteWs.Range("A" & I-1),"")<>"" AND Nz(pasteWs.Range("A" & I),"")="" then
        pasteWs.Range("A" & I)=pasteWs.Range("A" & I-1)
    End if
    If Nz(pasteWs.Range("B" & I-1),"")<>"" AND Nz(pasteWs.Range("B" & I),"")="" then
        pasteWs.Range("B" & I)=pasteWs.Range("B" & I-1)
    End if
Next

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/31 15:42

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

    キャンセル

  • 2018/01/31 15:49

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

    キャンセル

  • 2018/02/02 10:58

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

    キャンセル

  • 2018/02/02 11:04

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

    キャンセル

  • 2018/02/02 11:05

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

    キャンセル

  • 2018/02/02 11:13

    pasteWs の適用範囲外に記述していませんか?

    キャンセル

  • 2018/02/02 11:15

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

    キャンセル

  • 2018/02/02 11:23

    早速のご返信ありがとうございます。
    Accessというアプリ知らなかったので、勉強してみようと思います。
    教えてくださりありがとうございます。

    なお、実行できたのですが、次のコードがよく内容が理解できていません。
    理解があっていますでしょうか?

    intEndRow = pasteWs.Range("C1").End(xlDown).Row
    →現在データが入っている最終行を探す。(今回の場合は、C列に値が下まで入っているので、その最終行のを探す。)

    For I = 2 To intEndRow
    →2がなぜなのかと、intEndRowとIの違いがよくわかりません。

    度々の質問恐縮です。
    理解のヒントいただければ幸いです。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/31 13:38

    ありがとうございます。

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/31 13:39

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

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • VBA

    2395questions

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

  • Excel

    1974questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。