[[20200518165718]] 『特定のシートだけ処理がしたい』(ろくろ) ページの最後に飛ぶ

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

 

『特定のシートだけ処理がしたい』(ろくろ)

こんにちは

ExcelのVBAで質問があります。
特定のシート(例:日付_A,日付_A)のように“_A”というシートがあれば
そのシートのB列、AL列をコピーして作業シートに貼り付けたい場合
どのように処理を書けばいいでしょうか?

作業シートは以下の間隔で貼り付けたいです。
1つ目のシートはB列C列
2つ目のシートはF列G列
3つ目のシートはJ列K列



< 使用 Excel:Excel2013、使用 OS:Windows7 >


どこで詰まっているかわからないですが、こんな感じでは参考になりませんか?

    Sub 実験()
        Dim SH As Worksheet
        Dim c As Long

        With Worksheets("作業シート").Range("B1:C1")
            For Each SH In Worksheets
                If SH.Name Like "*_A" Then
                    MsgBox "【" & SH.Name & "】は処理対象だよ" & vbLf & "出力先は【" & .Offset(, c * 4).Address(False, False) & "】だよ"
                    c = c + 1
                End If
            Next SH
        End With
    End Sub

(もこな2 ) 2020/05/18(月) 17:23


 >そのシートのB列、AL列をコピーして作業シートに
 >1つ目のシートはB列C列 
 >2つ目のシートはF列G列 
 >3つ目のシートはJ列K列 

 Sub Test()
    Dim sh As Worksheet
    Dim i As Long

    For Each sh In Worksheets
        If sh.Name Like "*_A" Then
            i = i + 1
            sh.Range("B:B,AL:AL").Copy Worksheets("作業シート").Cells(1, i * 4 - 2)
        End If
    Next sh
 End Sub

(ピンク) 2020/05/18(月) 17:59


もこな2様
ピンク様

出来ました!
ありがとうございます。
(ろくろ) 2020/05/18(月) 18:11


追加で質問させて下さい。

作業シートは以下の間隔で貼り付けたいです。
1つ目のシートはB列C列
2つ目のシートはF列G列
3つ目のシートはJ列K列



上記処理は出来ました。
次にやりたいのが日付を取り出す処理です。

貼り付けたシートのC列、G列、K列に日付ごとのデータが入っています。
書式は"yyyy/m/d h:mm"です。
そこから日付だけを取り出し、それぞれをA列、E列、I列に入れたいです。
取り出す日付の書式"yyyy/m/d"で1つだけです。
range("A1")/range("E1")/range("J1")の様に入れたいです。

※必ずB列、C列には値が入っていますが、最終列はデータによって変動があります。

拙い説明で申し訳ありませんが、よろしくお願いいたします。

(ろくろ) 2020/05/19(火) 13:14


よくわからないけど
例えば、A1セルに「=C1」といれて、表示形式を"yyyy/m/d"にするんじゃだめなんですか?

>※必ずB列、C列には値が入っていますが、最終列はデータによって変動があります。
それならB列orC列で最終行を調べられるのでは?とおもいますが。。。

(もこな2 ) 2020/05/19(火) 13:26


もこな2様
再びコメントありがとうございます。
手動ではなく、マクロで自動的に日付を取り出したいのです、、、。

今のマクロは以下です。
この処理を最終列までマクロで出来ないでしょうか?

Sub Macro1()

    Dim dDate As Date
    Dim MaxCol As Long 

  '最終列
  MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column 

    dDate = DateValue(Range("C2"))
    Range("A1") = (CStr(dDate))
    Range("A1").NumberFormatLocal = "yyyy/m/d"
End Sub
(ろくろ) 2020/05/19(火) 13:37

お困りのところがわからないですけど、
CStr関数使うってことは、日付型【じゃないもの】にしたいってことですか?
それとも、時刻部分がいらないので削りたいってことですか?

提示ものも、CStr関数を使う必要性がピンときませんが↓のようなことだったりしますか?

    Sub 実験()
        With Range("A1")
            .Value = Format(Range("C2").Value, "yyyy/m/d")
            .NumberFormatLocal = "yyyy/m/d"
        End With
    End Sub

(もこな2 ) 2020/05/19(火) 14:25


>それとも、時刻部分がいらないので削りたいってことですか?
⇒そうです。
時刻を削りたく、日時から日付だけを取り出し、表示させたいとネット検索したらCStr関数を使っていたので使用していました。

ご提示して頂いた処理で欲しい値が取れました!
分からないのはどの様にループ処理を書けばいいかで悩んでいます。
(ろくろ) 2020/05/19(火) 14:58


以下の様に書いてみました。
修正した方が良ければコメント頂けると幸いです。

Sub Macro1()
  Dim i As Long

    Dim MaxCol As Long

    MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 3 To MaxCol Step 4
        Cells(2, i).Copy Cells(2, i).Offset(-1, -2)
        Cells(2, i).Offset(-1, -2).NumberFormatLocal = "yyyy/m/d"
    Next
End Sub
(ろくろ) 2020/05/19(火) 15:33

>修正した方が良ければ
ちゃんとうごいているなら、ご自身が理解できる方法が一番だと思います。

実は↓を書きこもうとして更新したらメッセージに気づきました。
(なので行ずれは想定してません)

    Sub 実験02()
        Dim 行 As Long

        For 行 = 1 To 10
            Cells(行, "A").Value = Format(Cells(行, "C").Value, "yyyy/m/d")
            Cells(行, "E").Value = Format(Cells(行, "G").Value, "yyyy/m/d")
            Cells(行, "I").Value = Format(Cells(行, "k").Value, "yyyy/m/d")
        Next 行
    End Sub
    '-----------------------------------------------------------------------------------
    Sub 実験03()
        Dim MyRNG As Range

        With ActiveSheet
            For Each MyRNG In Intersect(.UsedRange, .Range("C1,G1,K1").EntireColumn)
                MyRNG.Offset(0, -2).Value = Format(MyRNG.Value, "yyyy/m/d")
            Next MyRNG
        End With
    End Sub

なお、↓だと、時刻部分もコピーされちゃうから、私の「2020/05/19(火) 13:26」にいったこととほぼほぼ同じことになりません?

 Cells(2, i).Copy Cells(2, i).Offset(-1, -2)

さらに、もしかして【行】は固定でよかったんでしょうか?
行不定なので、最終行をしらべて・・・とおもっていたんですがどうもそうではないかんじですか?

(もこな2 ) 2020/05/19(火) 15:59


 参考に

 Sub Test()
    Dim sh As Worksheet
    Dim i As Long

    For Each sh In Worksheets
        If sh.Name Like "*_A" Then
            i = i + 1
            With Worksheets("作業シート")
                sh.Range("B:B,AL:AL").Copy .Cells(1, i * 4 - 2)
                .Cells(1, i * 4 - 3).Value = Format(sh.Range("AL2").Value, "yyyy/m/d")
            End With
        End If
    Next sh
 End Sub

(ピンク) 2020/05/19(火) 16:06


もこな2様
同じ処理をしていました。
指摘されて気付きました、、、。
最初にコメントを頂いた時にマクロを組んでみればよかったです。
大変失礼致しました。
コードのご提示ありがとうございます。
取得するのは1行のみでした。分かりづらい説明で申し訳ございません。
勉強させて頂きます。

ピンク様
昨日に引き続き教えて頂きありがとうございます。
また、昨日の処理も交えてコードを書いて頂いて感謝いたします!

(ろくろ) 2020/05/19(火) 18:23


>取得するのは1行のみでした。
なるほど、やはりそうでしたか。
では↓みたいな感じでもよいとおもいます。
    Sub Macro1_改()
        Dim 列 As Long

        For 列 = 3 To Cells(2, Columns.Count).End(xlToLeft).Column Step 4
            Cells(1, 列 - 3).Value = Format(Cells(2, 列).Value, "yyyy/m/d")
        Next 列
    End Sub

また、ピンクさんのように先日のコードと組み合わせることも可能ですね。

    Sub 実験_改()
        Dim SH As Worksheet
        Dim c As Long
        With Worksheets("作業シート").Range("B1")
            For Each SH In Worksheets
                If SH.Name Like "*_A" Then
                    Intersect(SH.Rows("1:" & SH.Cells.SpecialCells(xlCellTypeLastCell).Row), SH.Range("B:B,AL:AL")).Copy .Cells.Offset(, c * 4)
                    .Cells.Offset(, c * 4 - 1).Value = Format(SH.Range("B2").Value, "yyyy/m/d")

                    c = c + 1
                End If
            Next SH
        End With
    End Sub

(もこな2 ) 2020/05/19(火) 19:50


コメント返信:

[ 一覧(最新更新順) ]


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