Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Microsoft 365)
VBAの繰り返し処理
投稿日時: 22/06/13 18:23:48
投稿者: wgfyhsudji24w

B列に値が含まれている時、値が含まれている分だけ
(    WorkSheets(1).Range("J2" & myrow).Value = Rnage("E2").Value & Rnage("F2").Value & Rnage("G2").Value & Rnage("H2").Value の)
繰り返し処理を行いたいと思っております。
 
以下----作成したのですが、エラーが出ず動作しません。
 
Excelの内容としては、Sheet1にA列〜I列まで任意の項目と値が表形式で入っております。
繰り返し処理を行いたい処理内容は、"E2"〜右に"H2"までの項目を"J2"に出力する動作を、
B列の値が入っている行まで繰り返し処理を行いたいというものになります。
通常Excelですと、J2に入れた値をB列の値が入っている行までオートフィルを行う動作をVBAで行いたいと思っております。
修正すべき箇所のご指摘を頂けないでしょうか。
 
初心者です、お手数ですがよろしくお願いいたします。
 
B2 ↓ J2
B3 ↓ J3
B4 ↓ J4
B5 ↓ J5

値が入っている最終行まで
 
 
-------
 
Sub Test()
 
Const WF As String = "ファイルパス名"
Dim WFna As String
Dim s
Dim range1 As Range
 
WFna = Dir(WF & " ファイル名")
Workbooks.Open Filename:=WF & WFna
 
Set range1 = Range("B2")
range1.Select
i = 0
 
Do
'セル値を取得
s=ActiveCell.Offset(i, 0).Value
 
'セル値が未設定の場合
If s = "" Then
 
'ループをぬける
Exit Do
 
    WorkSheets(1).Range("J2" & myrow).Value = Rnage("E2").Value & Rnage("F2").Value & Rnage("G2").Value & Rnage("H2").Value
 
End If
 
i = i + 1
 
Loop
 
End Sub

回答
投稿日時: 22/06/13 18:40:06
投稿者: taitani

1. 途中で抜ける処理を記載する Do 〜 Loop なら、
Do Until もしくは、
Loop Until などを利用しましょう。
 
2. 「Worksheets(1).Range("J2" & myrow).Value」
そもそも、"myrow" はどこで定義してて、何に使ってるのかな?
 
"Worksheets(1).Range("J" & i +1 ).Value" とかならわかるけど。

回答
投稿日時: 22/06/13 18:44:26
投稿者: taitani

あと、インデントつける癖をつけましょうね。
あと、おそらく、"Else" が足りないですよね???
※ 以下は、正しいわけではないですので注意。
 

Sub Test()
    Const WF As String = "ファイルパス名"
    Dim WFna As String
    Dim s As Long
    Dim range1 As Range
     
    WFna = Dir(WF & " ファイル名")
    Workbooks.Open Filename:=WF & WFna
     
    Set range1 = Range("B2")
    range1.Select
    i = 0
     
    Do
        'セル値を取得
        s = ActiveCell.Offset(i, 0).Value
         
        'セル値が未設定の場合
        If s = "" Then
            'ループをぬける
            Exit Do
        Else
            Worksheets(1).Range("J" & i + 1).Value = Rnage("E2").Value & Rnage("F2").Value & Rnage("G2").Value & Rnage("H2").Value
        End If
        i = i + 1
    Loop
End Sub

回答
投稿日時: 22/06/13 23:05:30
投稿者: WinArrow
投稿者のウェブサイトに移動

掲示板にコードを記述する際は、
手入力はせずにコードペインから、コピペしましょう。
 
手入力したコードが間違えていたら
回答者は、そこを指摘するかもしれません。
例えば
>myrow
データ定義がされていないから、
実際には動いていないコードになる。
このように全く動かないコードを掲示した場合、
回答者からの逆質問、・・・キャッチボールが多発して、
解決までに時間が掛かってしまいます。

回答
投稿日時: 22/06/13 23:35:57
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
通常Excelですと、J2に入れた値をB列の値が入っている行までオートフィルを行う動作をVBAで行いたいと思っております。

>B列の値が入っている行まで
掲示のコードをみると
B列セルが空白でない間、繰り返すというように見えますが、
この解釈は、正しいですか?
また、オートフィルをコードで記述可能ですから
ループを使わなくてよいと思います。

回答
投稿日時: 22/06/13 23:41:51
投稿者: WinArrow
投稿者のウェブサイトに移動

 

引用:

  WorkSheets(1).Range("J2" & myrow).Value = Rnage("E2").Value & Rnage("F2").Value & Rnage("G2").Value & Rnage("H2").Value

 
この処理は、J2〜Jxxの全てのセルに、同じ値(E2&F2&G2&H2)が代入されてしまうが
それでよいのですか?

回答
投稿日時: 22/06/14 10:45:45
投稿者: Suzu

オートフィルでも可能ですが、
そもそも J列に入れたい のは、同じ行の E,F,G,H 列 のセル値の結合です。
 
 
同じ行
J2 に、『=E2 & F2 & G2 & H2』と入れ
J3 に 『=E3 & F3 & G3 & H3』と入れたい のだと思います。
 
数式として、入力方法が 2つある事はご存じですか?
一つは 先にも記述した 使用している A1方式。
数式が入った状態で、「ファイル」-「その他」-「オプション」 から 数式の「数式の処理」で
【R1C1参照形式を使用する】にチェックを入れます。
列の表示が、アルファベットから、数字になり、
J2 に入っていた数式が 『= RC[-5] & RC[-4] & RC[-3] &RC[-2]』になり
J3 に入っていた数式が J2と同じ『= RC[-5] & RC[-4] & RC[-3] &RC[-2]』となります。
 
これが R1C1形式 R(ow)行 と C(olumn) 列 を 数値で表す数式形式です。
(詳細は ヘルプを見るなり、WEB検索をしてみてください。)
 
R〇C[△] の場合、数式を入れたセルを基準に、〇行下、△列 右 を表します。
   RC[-5] は、0行下
       -5列右 → 5列左 を表します。
 
これは、J2でも、J3でも 同じですよね。
 
つまり、J列 どこでも 同じ数式が使える事になります。
R1C1形式の 数式を入れるには、FormulaR1C1 を使います。
 
なので、
J2 から、J● まで の FormulaR1C1 に、"= RC[-5] & RC[-4] & RC[-3] &RC[-2]" を渡せば良いです。
数式が一緒なので、
 Range("J2:J●").FormulaR1C1 ="= RC[-5] & RC[-4] & RC[-3] &RC[-2]"
で良く、ループが不要となります。
 
●については、
Cells(Cells(Rows.Count, "B").End(xlUp).Row で求める事ができます。
 
 
 
セル値の結合
 文字の結合 に、『&』を使いますが、 『CONTACT関数』もあります。
 この引数には、セル範囲を渡す事ができます。
 なので、"= RC[-5] & RC[-4] & RC[-3] &RC[-2]" を "=CONCAT(RC[-5]:RC[-2])" とする事ができます。
 
 
上記二つから ファイルを開くところは別として
Sub Test()
 Range(Cells(2, "J"), Cells(Cells(Rows.Count, "B").End(xlUp).Row, "J")).FormulaR1C1 = _
   "=CONCAT(RC[-5]:RC[-2])"
End Sub
 
または
Sub Test()
  Cells(2, "J").Resize(Cells(Rows.Count, "B").End(xlUp).Row - 1).FormulaR1C1 = _
   "=CONCAT(RC[-5]:RC[-1])"
End Sub
 
で済みます。[/b]

回答
投稿日時: 22/06/14 10:49:42
投稿者: Suzu

左辺の部分は
 
Cells(Rows.Count, "B").End(xlUp).Select
Cells(Cells(Rows.Count, "B").End(xlUp).Row, "J").Select
Range(Cells(2, "J"), Cells(Cells(Rows.Count, "B").End(xlUp).Row, "J")).Select
 
Cells(2, "J").Select
Cells(2, "J").Resize(2).Select
Cells(2, "J").Resize(Cells(Rows.Count, "B").End(xlUp).Row - 1).Select
 
辺りをステップ実行して、選択しているセル位置、セル範囲を確認してみてください。

投稿日時: 22/06/14 12:21:45
投稿者: wgfyhsudji24w

 
皆さん、たくさんのコメントを頂き、ありがとうございました。
 
ご指摘頂きました無駄なmyrowが入ってた部分は削除しました。
次回投稿させていただく際には手動入力ではなくコピペでインデントをつけて投稿するようにします。
 
suzuさんに解明頂きました以下の通りの要望がありました。
>同じ行 

>J2 に、『=E2 & F2 & G2 & H2』と入れ 

>J3 に 『=E3 & F3 & G3 & H3』と入れたい のだ
>と思います。
 
オートフィルの方法は成功しました!
ループ処理について、ご記載頂きましたさまざまな方法でためしてみます!
 
たくさんのご意見を頂き、誠にありがとうございました!