[[20200502034136]] 『行も列も両方空白まで反映させたいです。』(へぼ助bb) ページの最後に飛ぶ

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

 

『行も列も両方空白まで反映させたいです。』(へぼ助bb)

行も列も空白までループについて教えて下さい。
初歩的な質問ですみません。
シート1のC5セルを起点に行も列も空白になるまで
シート1のK10セルを起点にコピーしたいという場合どういったコードが
一番シンプルに作成できますでしょうか。
初心者で全然知識が浅いので
Sub 数値の反映 ()
  Dim i As Long

    i = 5
Do While Cells(i, 3) <> ""
    Cells(i + 5, 11) = Cells(i, 3)
    Cells(i + 5, 12) = Cells(i, 4)
    Cells(i + 5, 13) = Cells(i, 5)
    Cells(i + 5, 14) = Cells(i, 6)
    i = i + 1
    Loop
End Sub
と言った感じで凌いでいますが
C列だけのデータ、CD列のデータ、、CDEF列のデータ
など複数あり
C行が空白になるまでついでに列も空白になるまで選択して
まとめて反映させる方法があれば教えて頂きたいです。
説明も下手で申し訳ありません。よろしくお願いします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 おはようございます。
 >C行が空白になるまでついでに列も空白になるまで選択して
 多分 CurrentRegion のことだと思います。

 >一番シンプルに作成できますでしょうか。 
 一番かどうかはわかりませんが、、記録すると↓こんな書き方も出来ると思います。
 結合セルとかはなしです。。。。

 Option Explicit
Sub Macro1()
    Columns("C:C").Insert Shift:=xlToRight
    Rows("5:5").Insert Shift:=xlDown
    Range("D6").CurrentRegion.Copy
    Range("L11").Select
    ActiveSheet.Paste
    Columns("C:C").Delete Shift:=xlToLeft
    Rows("5:5").Delete Shift:=xlUp
End Sub
(SoulMan) 2020/05/02(土) 07:52

SoulMan さん

ありがとうございます。
教えていただいたすごく参考になりました。
これから活用させていただきたいと思います。

説明不足で一つ、後付けという形になってしまい申し訳ないのですが
    
    C5セルを空白の行まで反映させるが
    D5セルが空白だった場合C列のみの反映し他の列はコピーさせずにスルーさせたい
    
    C5セルD5セルにもデータが入力されていたら
    CD列のみ空白の行まで反映 (EFG列はコピーさせずにスルーさせたい)

    C5セルD5セルE5セルにも入力されていたら
    CDE列のみ空白の行まで反映(FGはコピーさせずにスルーさせたい

    という形は可能でしょうか
    空白になる最終行はどの列も同じになります。

    すみませんがこれが可能でしたら教えていただけたらと思います。
     

    
(へぼ助bb) 2020/05/02(土) 11:19


横からですが、SoulManさんが示されているようにループ処理はたぶん要らないと思います。

また、Valueプロパティを直接参照してるので、値を転記したいということだとおもいますが、それなら値貼付すればよいです。

さらに、追加の「空白なら無視する」設定も「形式を選択して貼り付け」で対応できます。

    Sub 数値の反映_改()
        If Cells(Rows.Count, "C").End(xlUp).Row < 5 Then
            MsgBox "データなし"
            Exit Sub
        End If

        Range("C5", Cells(Rows.Count, "C").End(xlUp)).Resize(, 4).Copy
        Range("K10").PasteSpecial Paste:=xlPasteValues, SkipBlanks:=True
    End Sub

(もこな2 ) 2020/05/02(土) 13:01


 すみません。よくよく読み返すと値だったんですね(^^;
ところで、、↓これって途中に空白があるんですよね?
 >C行が空白になるまでついでに列も空白になるまで選択して

 私も最初は下からかなと思ったんですが、、、範囲の選択って難しいでしょ?
色んなレイアウトがありますからね
以前もどこかで書きましたが永年書いていても悩むところではありますよね?

 で、本当は下から上になんでしょうけど、、空白まで。。。となると
上から下なんですね。でもこれはもろ刃の剣である意味不確かで場合によっては禁じ手なんですよね
作成者の暗黙のルールで必ず下に何かある。例えば表の中の合計とか。。。。
そんなこんなを全部含めて設計しないと一概には言えない部分があると思います。

 下から上だとFindの逆とかRangeの End(Xlup) とか色々あるんですけどね。。。
最初のご質問の趣旨からしますと全然シンプルじゃないので多分違うと思いますけど、、
まぁ、、ジャブ程度でお願いします。。。。

 Option Explicit
Sub てすと()
Dim MyA As Variant
Dim r As Range
Dim 最大値 As Long
Select Case True
    Case Application.CountA(Range("C5:E5")) = 3
        For Each r In Range("C5:E5")
            If 最大値 < r.End(xlDown).Row Then 最大値 = r.End(xlDown).Row
        Next
        MyA = Range("C5", Range("E" & 最大値)).Value
    Case Application.CountA(Range("C5:D5")) = 2
        For Each r In Range("C5:D5")
            If 最大値 < r.End(xlDown).Row Then 最大値 = r.End(xlDown).Row
        Next
        MyA = Range("C5", Range("D" & 最大値)).Value
    Case Application.CountA(Range("D5")) = 0
        MyA = Range("C5", Range("C5").End(xlDown)).Value
End Select
Range("K10").Resize(UBound(MyA, 1), UBound(MyA, 2)).Value = MyA
End Sub
(SoulMan) 2020/05/02(土) 14:08

ありがとうございました。難しいものですね。
というか私の説明が下手すぎます。

あるデータを取得するときはC5からC60
あるデータを取得したときはC5からC55
あるデータを取得したときはC5からD55
あるデータを取得したときはC5からE35
あるデータを取得したときはC5からF65
途中のセル途中に空白はない
というルールで
取得された範囲のみを特定の場所にコピーというか反映をさせられればと
なんとか考えていました。

もっと勉強してみます。
ありがとうございます。難しいですね。

          
(へぼ助bb) 2020/05/02(土) 17:49


まさに、説明が下手すぎます。
たぶん、

 Sub test()
    With Range("C5")
        With .Resize(.End(xlDown).Row - .Row + 1, .End(xlToRight).Column - .Column + 1)
            Range("K10").Resize(.Rows.Count, .Columns.Count).Value = .Value
        End With
    End With
 End Sub

(kazuo) 2020/05/02(土) 18:53


 衝突しました。。。そのまま投稿します。。。
 そこまでわかっているのなら全然難しくないですよ
こういう掲示板では見えないもの同士がやり取りしているわけですから
色んなパターンを考えざるをえないんです。

 あるデータという条件がどんな条件なのかわかりませんが、
優先順位の付け方だけ間違わない様に応用してください。
そんなに難しくないです。。。

 Option Explicit
Sub てすと()
Dim MyA As Variant
Select Case True
    Case Application.CountA(Range("C5:E5")) = 3
        'あるデータを取得したときはC5からE35
        MyA = Range("C5:E35").Value
    Case Application.CountA(Range("C5:D5")) = 2
        'あるデータを取得したときはC5からD55
        MyA = Range("C5:D55").Value
    Case Application.CountA(Range("D5")) = 0
        'あるデータを取得したときはC5からC55
        MyA = Range("C5:C55").Value
End Select
Range("K10").Resize(UBound(MyA, 1), UBound(MyA, 2)).Value = MyA
End Sub
(SoulMan) 2020/05/02(土) 18:56

失礼、私のは1行1列ダメです。無視して下さい。
(kazuo) 2020/05/02(土) 19:21

板汚しですが、直しを投稿しておきます。

 Sub test()
    Dim rw As Long, cl As Long
    With Range("C5")
        rw = .End(xlDown).Row
        If .Offset(1).Value = "" Then rw = .Row
        cl = .End(xlToRight).Column
        If .Offset(, 1).Value = "" Then cl = .Column
        With .Resize(rw - .Row + 1, cl - .Column + 1)
            Range("K10").Resize(.Rows.Count, .Columns.Count).Value = .Value
        End With
    End With
 End Sub

(kazuo) 2020/05/02(土) 21:13


コメント返信:

[ 一覧(最新更新順) ]


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