[[20180305112814]] 『特定シートがなかったら特定シートを新しく作る』(美鈴) ページの最後に飛ぶ

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

 

『特定シートがなかったら特定シートを新しく作る』(美鈴)

おせわになります
ご教示くださいませ。
まとめ というシートがなかった場合
新しくまとめというシートを作り
下記のマクロを使いたいです

なにとぞよろしくお願いします
Sub まとめ()

Dim sh As Worksheet
Dim lr As Long, tlr As Long
 For Each sh In Worksheets
  If sh.Name <> "まとめ" And sh.Name <> "List" And sh.Name <> "ID" And   sh.Name <> "Bace" Then
 lr = sh.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
 sh.Rows("1:" & lr).Copy
  tlr = Sheets("まとめ").Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
  Sheets("まとめ").Range("A" & tlr + 1).PasteSpecial
  Application.CutCopyMode = False
End If
Next
End Sub

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


いくつかやり方はあるとおもいますけど、
>まとめ というシートがなかった場合、新しくまとめというシートを作り
の部分は、こんなのでもよいかもしれません。

既存のマクロとくっつけるのはご自身で取り組んでみて、詰まってしまったらどの部分がわからないのか提示して改めて聞いてみるとよいとおもいます。

Sub Sample()
Dim sh As Worksheet
Dim まとめシート As Worksheet

For Each sh In Worksheets

    If sh.Name = "まとめ" Then
        Set まとめシート = sh
        Exit For
    End If
Next sh

If まとめシート Is Nothing Then

    Set まとめシート = ThisWorkbook.Worksheets.Add
    まとめシート.Name = "まとめ"
End If

End Sub

(もこな2) 2018/03/05(月) 12:07


もこな2さま

有難う御座います
  
参考にさせていただきます
(美鈴) 2018/03/05(月) 12:35


元のコードを拝見しててちょっと気になるところがあったので参考に。

>If sh.Name <> "まとめ" And sh.Name <> "List" And sh.Name <> "ID" And   sh.Name <> "Bace" Then
好みですけど、Select case を使ってもよいかなと思いました。

>lr = sh.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
「ActiveSheet」は「sh」の誤りではないでしょうか?

>Sheets("まとめ").Range("A" & tlr + 1).PasteSpecial
「PasteSpecialメソッド」使ってますが、引数を省略してるので、ただのPasteメソッドと同じになってるような気がします。
そして、ただのPasteメソッドであれば、COPYメソッドの引数として貼付先を渡してしまえば、Pasteメソッドの記述は不要になるとおもいます。

というのを纏めるとこんな感じになるかとおもいます。興味があれば研究してみてください。

Sub まとめ_改()
'==変数の宣言など

    Dim sh As Worksheet
    Dim まとめSH As Worksheet
        Set まとめSH = ThisWorkbook.Worksheets("まとめ")

'==処理

    For Each sh In Worksheets
        Select Case sh.Name
            Case Is = "まとめ", "List", "ID", "Bace"

            Case Else
                With sh
                    Range(.Rows(1), .Rows(.Cells(.Rows.Count, "A").End(xlUp).Row)).Copy _
                        まとめSH.Cells(まとめSH.Rows.Count, "A").End(xlUp).Offset(1, 0)
                End With
        End Select
    Next sh
End Sub
(もこな2) 2018/03/05(月) 15:50

 もこな2さん
 Rangeの前に.が抜けてるよ。
(ろっくん) 2018/03/05(月) 16:56

> Range(.Rows(1), .Rows(.Cells(.Rows.Count, "A").End(xlUp).Row)).Copy
↑のことですか?

であれば、私もつい最近知ったんですが、こんなふうに記述すると、Application.Range って解釈されて シートの指定を要しないらしいです。
http://www.moug.net/faq/viewtopic.php?t=76639

でもなんでActiveSheet.Rangeと解釈されず、Application.Rangeって解釈になるのかは、実はよくわかってない・・・とりあえずテストではエラーにならず動作してます。(Excel2013でチェック済み)
(もこな2) 2018/03/05(月) 22:14


 もこな2さん
 へぇ〜勉強になりました。
 Rangeの場合シートを省略するとActiveSheetが対象となる、と思ってました。
 Applicationのメンバにあるんですね〜。

 そういえば、関数でも昔はApplication.SumやApplication.Matchなんて
 書き方していたのを思い出しました。

 トピ主さん場所をお借りしてすみません。

(ろっくん) 2018/03/06(火) 08:41


コメント返信:

[ 一覧(最新更新順) ]


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