• ベストアンサー

エクセルVBAでシートの並べ替え

シートAと、Aを参照しているシートBのセットを複数枚複製するVBAです。これはこれでちゃんと作動し、複製されたB(n)はA(n)を正しく参照しています。 For n = 1 To X'(Xは変数です。) Sheets(Array("A", "B")).Copy after:=Sheets(Sheets.Count) Next 質問は、このマクロで生成されたシートの並び替え方法です。現状ではA,B,A(2),B(2)~A(n),B(n)ですが、これをA, A(2)~A(n)、B,B(2)~B(n)というようにそれぞれ順番に並べたいのです。どうすればよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

merlionXX さん、こんばんは。 私のコードは、1度きりなら、10以上でも、問題は出ないはずですが、まあ、シートの追加スタイルの場合の時のための修正コードを作りましたので、良かったら差し替えていただけますでしょうか?「人のコードは、さっぱりわからない」という所でしょうが、これら各々は、コードのパーツで、汎用性がありますから、後々、別な場所で使えます。 SheetOrdering プロシージャと並べ替え用の2次元配列用のBsort (バブルソート)を入れ替えていただけますでしょうか?問題がなければ、参考用でも構いません。 #4と同じ要領で、元は替えなくてよいです。 '----------------------------------------------- Sub SheetOrdering(ByVal ShName As Variant) Dim Shtes() Dim i As Long ReDim Shtes(1, 0) With ActiveWorkbook Shtes(0, 0) = 0 Shtes(1, 0) = ShName For i = 1 To Worksheets.Count  If Worksheets(i).Name Like Shtes(1, 0) & "?*" Then   j = j + 1   ReDim Preserve Shtes(1, j)   Shtes(0, j) = Val(Mid$(Worksheets(i).Name, InStr(1, Worksheets(i).Name, "(", 1) + 1))   Shtes(1, j) = Worksheets(i).Name  End If Next BSort Shtes() Application.ScreenUpdating = False  On Error GoTo ErrHandler  For k = 1 To UBound(Shtes, 2)   .Worksheets(Shtes(1, k)).Move After:=.Worksheets(Shtes(1, k - 1))  Next  Application.ScreenUpdating = True  End With ErrHandler:  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description  End If End Sub Private Function BSort(BaseArray() As Variant)  Dim u As Long  Dim i As Long  Dim j As Long  Dim t1 As Long  Dim t2 As String  u = UBound(BaseArray(), 2)  i = LBound(BaseArray(), 2)  Do While i < u   j = u   Do While j > i    If Val(BaseArray(0, i)) > Val((BaseArray(0, j))) Then '昇順     t1 = BaseArray(0, j)     t2 = BaseArray(1, j)     BaseArray(0, j) = BaseArray(0, i)     BaseArray(1, j) = BaseArray(1, i)     BaseArray(0, i) = t1     BaseArray(1, i) = t2    End If    j = j - 1   Loop   i = i + 1  Loop End Function

merlionXX
質問者

お礼

もう、何から何まで至れり尽せりでなんとお礼を申したらいいのやら。 完璧です。 Wendy02さん、有難うございました!

その他の回答 (6)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#2です。 もう解決されたようなので運用上なんの問題も無いのでしょうが、、、 > やってみましたが、AB交互になってしまいました。 私は並び替えのサンプルを書いたのではないので。 ただ、シート「構M」を20枚コピーした場合などは、( )内の数字の桁が揃ってないと 構M 構M(10) 構M(11) 構M(12) 構M(13) 構M(14) 構M(15) 構M(16) 構M(17) 構M(18) 構M(19) 構M(2) 構M(20) 構M(3) 構M(4) 構M(5) 構M(6) 構M(7) 構M(8) 構M(9) のようになってしまうのではと思っただけです。 余計なお節介のようでした。

merlionXX
質問者

お礼

そういうことでしたか! まだテスト段階だったので10枚以上は試していませんでした。 やってみたら確かにそうなりました。 そこまでのご配慮、ほんとうにありがとうございます。 感激です。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 Wendy02です。 >もうぜんぜんわけがわからなくなり、上記のようにしましたがこれでいいんですよね? いいけれども、 >Private Function myShCounter(ShName As String) As Long これは要らなくなりましたね。 配列変数を使うと、ややこしいかもしれませんね。 それと、なるべくデータ型の宣言はしたほうが、その値の流れが読めるようになります。

merlionXX
質問者

お礼

ありがとうございます。 おかげさまで出来ましたが、これでなぜ今度は構Mが先にくるのか見当もつきません。これじゃダメですよねえ。 でも助かりました、有難うございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。Wendy02です。 >>本来は、Type:=2 用になっているようですが >数字しか入力してほしくないのでType:=1としたのですが変ですか? # If ans = "" Or ans = False Then 実際には、"" は、入りませんね。"" は、Type:=2 にして、空の状態のまま、OK を押した場合です。 Input メソッドで、唯一、空の状態を受けられるのは、Type:=2 なのですね。全体的な流れからすると、ans は、Variant 型で使われているようにお見受けしています。 あまり大勢に影響はありませんが。 '------------------------------------------------- これは、元のシートの後ろに入れていくように作られています。それでよかったのかしら?構M が先にあるから、先に並ぶだけです。最初のものを少し変えただけです。以下は、私の考えた方法です。 元のコードの途中 For n = 1 To ans  Sheets(Array("構M", "構F")).Copy After:=Sheets(Sheets.Count) '変更部分開始 For Each Sh In Array("構M", "構F")  Call SheetOrdering(Sh) '変更  Next '変更部分終了 それで、SheetOrdering を以下のものと置き換えてください。 Sub SheetOrdering(ShName As Variant) Dim Shtes() As String Dim Sh As Variant Dim i As Integer Dim j As Integer Dim k As Integer With ActiveWorkbook ReDim Shtes(0) Shtes(0) = ShName  For i = 1 To .Sheets.Count   If .Sheets(i).Name Like ShName & "?*" Then   j = j + 1   ReDim Preserve Shtes(0 To j)   Shtes(j) = .Sheets(i).Name   End If  Next   If j = 0 Then Exit Sub   BSort Shtes()  Application.ScreenUpdating = False  On Error GoTo ErrHandler  For k = 1 To UBound(Shtes)   .Worksheets(Shtes(k)).Move After:=.Worksheets(Shtes(k - 1))  Next  Application.ScreenUpdating = True  End With ErrHandler:  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description  End If End Sub '------------------------------------------------- '以下そのまま(実際には使われていませんが、違っていたら、こちらで直します。) Private Function BSort(BaseArray() As String) '省略 End Function

merlionXX
質問者

お礼

もうぜんぜんわけがわからなくなり、上記のようにしましたがこれでいいんですよね? ちゃんと作動するようです。

merlionXX
質問者

補足

このようにしました。 Sub TEST01() ans = Application.InputBox("明細はあと何構分必要ですか?( ̄Δ ̄;)", Type:=1) If ans = "" Or ans = False Then Exit Sub End If If MsgBox(ans & "構を追加します。" _ & vbCr & "限度を設定しますか?", vbYesNo, " 確認") = vbYes Then For n = 1 To ans Sheets(Array("構M", "構F")).Copy After:=Sheets(Sheets.Count) For Each Sh In Array("構M", "構F") Call SheetOrdering(Sh) '変更 Next Next Else For n = 1 To ans Sheets("構M").Copy After:=Sheets(Sheets.Count) Next End If End Sub Sub SheetOrdering(ShName As Variant) Dim Shtes() As String Dim Sh As Variant Dim i As Integer Dim j As Integer Dim k As Integer With ActiveWorkbook ReDim Shtes(0) Shtes(0) = ShName For i = 1 To .Sheets.Count If .Sheets(i).Name Like ShName & "?*" Then j = j + 1 ReDim Preserve Shtes(0 To j) Shtes(j) = .Sheets(i).Name End If Next If j = 0 Then Exit Sub BSort Shtes() Application.ScreenUpdating = False On Error GoTo ErrHandler For k = 1 To UBound(Shtes) .Worksheets(Shtes(k)).Move After:=.Worksheets(Shtes(k - 1)) Next Application.ScreenUpdating = True End With ErrHandler: If Err.Number > 0 Then MsgBox Err.Number & " : " & Err.Description End If End Sub Private Function myShCounter(ShName As String) As Long 'シートカウンタ Dim i As Long Dim cnt As Long For i = 1 To ActiveWorkbook.Sheets.Count If Sheets(i).Name Like ShName & "*" Then cnt = cnt + 1 End If Next i myShCounter = cnt End Function Private Function BSort(BaseArray() As String) Dim u As Long Dim i As Long Dim j As Long Dim t As String u = UBound(BaseArray()) i = LBound(BaseArray()) Do While i < u j = u Do While j > i If BaseArray(j) < BaseArray(i) Then '昇順 t = BaseArray(j) BaseArray(j) = BaseArray(i) BaseArray(i) = t End If j = j - 1 Loop i = i + 1 Loop End Function

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 私の使っているコードから直してもよいのですが、それは、汎用性の意味が強いので、ひじょうに複雑になります。ですから、元から直したほうが早いと思いました。 以下をご覧になってください。 それから、 Application.InputBox は、コード的にみると、本来は、Type:=2 用になっているようですが、あえて、Type:=1 のままにしました。 >  If MsgBox(ans & "構を追加します。" _ >   & vbCr & "限度を設定しますか?", vbYesNo, " 確認") = vbYes Then この部分は、本当は、Yes/No ではないようですが、そのままにしました。 欲を言うと、シートは、CodeName で処理していくのが一番なのですが、それは、会社などで使うものにはあまり関係がありません。 Sub TEST01R()   Dim ans As Variant   Dim i As Integer   Dim j As Integer   Dim n As Integer   Dim m As Integer     ans = Application.InputBox("明細はあと何構分必要ですか?( ̄Δ ̄;)", Type:=1)   If ans = 0 Or VarType(ans) = vbBoolean Then    Exit Sub   End If     If MsgBox(ans & "構を追加します。" _    & vbCr & "限度を設定しますか?", vbYesNo, " 確認") = vbYes Then         i = myShCounter("構M") - 1 '追加された場合        Application.ScreenUpdating = False        For n = 1 To ans      Sheets("構M").Copy After:=Sheets(Sheets("構M").Index + n - 1 + i)    Next n        j = myShCounter("構F") - 1    For n = 1 To ans       Sheets("構F").Copy After:=Sheets(Sheets("構F").Index + n - 1 + j)    Next n     Application.ScreenUpdating = True         Else          Application.ScreenUpdating = False        i = myShCounter("構M") - 1 '追加された場合    For m = 1 To ans      Sheets("構M").Copy After:=Sheets(Sheets("構M").Index + m - 1 + i)    Next         Application.ScreenUpdating = True   End If End Sub Private Function myShCounter(ShName As String) As Long 'シートカウンタ Dim i As Long Dim cnt As Long  For i = 1 To ActiveWorkbook.Sheets.Count   If Sheets(i).Name Like ShName & "*" Then    cnt = cnt + 1   End If  Next i  myShCounter = cnt End Function

merlionXX
質問者

お礼

Wendy02さん、有難うございます。 いつもお手数おかけしまして申し訳ありません。

merlionXX
質問者

補足

わたしの質問がまずかったようです。 構Fシートは構Mシートを参照しています。だから構Fシートと構Mシートを増やす場合は構Fシート(2)はペアとなる構Mシート(2)を参照しなくてはなりません。だから2枚まとめてコピーしているのです。No3のやり方だと参照が正しくなりません。 並び順ですが構Fシートと構Mシートを増やす場合、まず構Mが順番で並び、次に構Fが順番で並ぶようにしたいのですが、No2No3のやり方だと、まず構Fの順番が構Mの順番より先(左)にきてしまうんです。 > この部分は、本当は、Yes/No ではないようですが、そのままにしました。 場合により構Fシートが不要の時があります。(意味不明でしょうが、とある「限度を設定しない場合」です。)だからYesNoで聞き、Noの場合は構Mシートのみコピーするようにしています。 >本来は、Type:=2 用になっているようですが 数字しか入力してほしくないのでType:=1としたのですが変ですか?

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

シート名は文字なので n が 10 以上で桁が揃っていない場合は上手く並ばないので、事前に桁を揃える作業が必要と思います。 汎用性が無いので、あまり良いサンプルでは無いですけど。 Sub aaa() x = 10: i = 2 On Error Resume Next  For n = 1 To x '(Xは変数です。)   Sheets(Array("A", "B")).Copy after:=Sheets(Sheets.Count)   Sheets(Sheets.Count - 1).Name = "A(" & Format(i, "00") & ")"   Sheets(Sheets.Count).Name = "B(" & Format(i, "00") & ")"   i = i + 1 Next End Sub

merlionXX
質問者

お礼

ありがとうございます。 やってみましたが、AB交互になってしまいました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

merlionXX さん、こんばんは。 一応、こんな風でよいかと思いますが、こういうのは、実際には、思ってもみないエラーが発生することがあります。申し訳ないけれど、しばらく使ってみて、エラーが出たら、原因を考えてみてください。私は、2年間、似たようのものを使っていますが、未だに完璧とは言えません。 そういう理由で、ErrHandler を付け加えました。 なお、Sheet1 という名前のつくものは、並べ替えを除外対象にしました。 '------------------------------------------ Sub SheetOrdering() Dim Shtes() As String Dim sh As Variant Dim i As Integer Dim j As Integer Dim k As Integer With ActiveWorkbook  For i = 1 To .Sheets.Count   If Not .Sheets(i).Name Like "Sheet*" Then   j = j + 1   ReDim Preserve Shtes(1 To j)   Shtes(j) = .Sheets(i).Name   End If  Next   BSort Shtes() '並べ替え  Application.ScreenUpdating = False  On Error GoTo ErrHandler  For Each sh In Shtes   k = k + 1   .Worksheets(sh).Move Before:=.Worksheets(k)  Next  Application.ScreenUpdating = True  End With ErrHandler:  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description  End If End Sub Private Function BSort(BaseArray() As String)  Dim u As Long  Dim i As Long  Dim j As Long  Dim t As String  u = UBound(BaseArray())  i = LBound(BaseArray())  Do While i < u   j = u   Do While j > i    If BaseArray(j) < BaseArray(i) Then '昇順     t = BaseArray(j)     BaseArray(j) = BaseArray(i)     BaseArray(i) = t    End If    j = j - 1   Loop   i = i + 1  Loop End Function

merlionXX
質問者

お礼

ありがとうございます。 下記でちゃんと作動します。 Sub TEST01() ans = Application.InputBox("明細はあと何構分必要ですか?( ̄Δ ̄;)", Type:=1) If ans = "" Or ans = False Then Exit Sub End If If MsgBox(ans & "構を追加します。" _ & vbCr & "限度を設定しますか?", vbYesNo, " 確認") = vbYes Then For n = 1 To ans Sheets(Array("構M", "構F")).Copy After:=Sheets(Sheets.Count) Call SheetOrdering'ここで使わせてもらいました。 Next Else For n = 1 To ans Sheets("構M").Copy After:=Sheets(Sheets.Count) Next End If End Sub ところが並びが構Fの方が構Mの前になってしまうんです。構Mを溝Fの先に持っていきたいのですが、教えていただいたVBAのどこを変えればいいのかわかりません。勝手を言いますがご教示いただけませんでしょうか?

関連するQ&A

  • エクセルVBAで複製シートの参照方法

    下記はシートMMMと、MMMを参照しているシートFFFのセットを複数枚複製するVBAを作りました。 シートMMMは一つの所在地の明細表で、最初はブランクです。所在地が複数ある場合にシートを複製します。 For n = 1 To X'(Xは変数です。) Sheets(Array("MMM", "FFF")).Copy after:=Sheets(Sheets.Count) Next ところがMMMには名前「小計」が定義されたセルがあります。 明細表が書ききれなくなり、行を追加され、小計のアドレスが変わっても、後から別シートに全複製シートの小計を参照できるようにするために名前を定義したんです。 ところが、マクロが走ると、その名前を複製後のシートでもその名前を使用するかどうかを聞いてきて、止まってしまいます。 Application.DisplayAlerts = Falseで回避すると、自動的に「はい」になり名前の「小計」は最初のMMMにしか存在しなくなり、参照には使えなくなります。 困りました。 複製された各シートの小計セルに自動で「小計」と名前定義する方法、または別に名前定義でなくてもいいんですが、任意に増やしたMMMやFFFシートの複製の小計があるセルを別のシートに後から参照させる方法はないでしょうか?最初は存在しないシートですんで最初からTOTALのシートで参照しておくことが出来ません。また、行数を増やされる場合があるので、アドレスでは小計のセルを特定出来ないし、最下行でもないのでEnd(xlUp)で取得することもむずかしいんです。

  • エクセルVBAでシートコピー

    Sheets("Sheet1")をCopyして、現在の最終のシートの後に持っていき、それを変数wsに設定しようとしています。 Sub TEST01() Sheets("Sheet1").Copy After:=Sheets(Sheets.Count) Set ws = Sheets(Sheets.Count) MsgBox ws.Name End Sub これで通常はうまくいきますが、最終シートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Sheets("Sheet1")をCopyして、現在の最初のシートの前に持っていき、それを変数に設定しようとしています。 Sub TEST02() Sheets("Sheet1").Copy Before:=Sheets(1) Set ws = Sheets(1) MsgBox ws.Name End Sub これで通常はうまくいきますが、最初のシートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Set ws = ActiveSheet で設定できましたが、それ以外の方法はないでしょうか?

  • Excel VBAの不可解(?)な動作について

    Excel 2000 VBAでの質問です。 Sheet1に以下のようなコードを書きました。 --------------------------------------------------------- Public Sub test() Application.DisplayAlerts = False Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" Sheets("test").Visible = xlVeryHidden Sheets("Sheet3").Visible = xlVeryHidden Sheets("test").Visible = True Sheets("test").Delete Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" '問題の行 Application.DisplayAlerts = True End Sub --------------------------------------------------------- このコードで期待している動作は、最終的にSheet3(xlVeryHiddenになっている)の後ろにSheet2をコピーし、その名前を「test」にするというものです。 しかし、実際にはSheet3の後ろにSheet2がコピーされるものの、名前はSheet2が「test」と変更されてしまいます。 Sheets.Countの値はSheet3をさしているはずなのですが・・・。 皆様に教えていただきたいのは、 ・この意図しない動作がなぜ起こるか ・どうすればこの問題を回避できるか です。よろしくお願いいたします。 もし初歩ミスでしたら、申し訳ありません・・・。ご指摘ください。

  • エクセルでシート複製(マクロ)

    いつもお世話になります。 いろいろ検索して下記のコードにたどり着きましたが、c10の値のシートが「現在」のシートの左側にきてほしいのですが、afterをbeforeにすると「現在(2)」-「c10の値」になってしまいます。 ちなみに下記コードを実行すると「現在」-「c10の値」の並びになります。 欲しいのは「c10の値」-「現在」の並びです。 マクロを実行する度にシートが右に増えていくイメージです。 よろしくお願い致します。 Sub 現在() Sheets("現在").Copy after:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = Range("c10").Value End Sub

  • エクセル VBA

    (1) Sub 印刷() With Sheets("原本") .Cells.FormatConditions.Delete .PageSetup.PrintArea = Range("A1:K73").Address .PrintOut End With End Sub としているのですが ボタンを間違って押した時も印刷がされてしまいます 押したときに 印刷しますか? はい いいえ みたいなのを確認するようにしたいのですが どうすればいいでしょうか? (2) Sub 保存() Dim MySheetName As String MySheetName = InputBox("シート名を入力してください") Sheets("9月1日").Copy After:=Sheets(Worksheets.Count) ActiveSheet.Name = MySheetName Sheets("原本").Range("A1:K73").Copy Sheets("原本").Range("A1") End Sub で原本シートをコピーして新しいシートを作成するプログラムを 作ったのですが、シート名を入力しはいを押すと作成されるのですが キャンセルを押した時も勝手にシートが作成されるのですが キャンセル時は何もシートを作成しないように したいのですが どうしたらいいでしょうか? どちらも教えて貰いながら作成したため 自分で修正できなく困ってます お手数ですがよろしくお願いします

  • ブックの保護(シート構成) でシートのコピー

    エクセルで外部データを参照させるために, 別のブックを開きシートをコピーし元のブックに貼り付け別のブックは閉じるというマクロを作成しました。 Workbooks.Open Filename:=a Sheets("データ").Select Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー") Workbooks(a).Close SaveChanges:=False a(変数)というファイルを開く シートのデータを選択 データをコピーし ファイル.xls のメニューシートの後に貼り付け a(変数)のエクセルファイルを保存せずに閉じる 動作としては正常に動きました。 しかし、この ファイル.xls には ID とパスワードで管理しています。 その管理したシートがあるんですが、それを表示させないために シートを非表示→ブックの保護→シート構成 を行いました。 マクロを動かすと、シート構成をしているので Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー")  が動かないことに気が付きました。 何かいい方法があればご教授お願いします。

  • Excel VBA 非表示の別ブックへシートコピー

    Excel2010のVBAで、別のExcelブックを非表示で開いて、 シートをコピーすると、 「実行時エラー'1004':WorksheetクラスのCopyメソッドが失敗しました。」 というエラーが出て、正しくシートをコピーすることができません。 (1)のように自分のブックへはシートをコピーすることはできるのですが、 (2)のように別のExcelブック上でシートをコピーする場合と (3)のように別のExcelブック上にシートをコピーする場合の いずれも同様のエラーになります。 どのように記述すれば(2)と(3)でもコピーすることができるのでしょうか。 ------------------------------------------------------------- Sub test()  Dim newEx As Excel.Workbook  Dim newFile As String  newFile = ThisWorkbook.Path & "\New_Book.xlsx"  Set newEx = Workbooks.Open(newFile, UpdateLinks:=0)  Application.Windows("New_Book.xlsx").Visible = False  '(1)New_BookのSheet3を自分のブックにコピーする (正常)  newEx.Worksheets("Sheet3").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)  '(2)New_BookのSheet3をNew_Bookにコピーする (エラー)  newEx.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  '(3)自分のブックのSheet3をNew_Bookにコピーする (エラー)  ThisWorkbook.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  Application.Windows("New_Book.xlsx").Visible = True  Application.DisplayAlerts = False  newEx.Save  newEx.Close  Application.DisplayAlerts = True  Set newEx = Nothing End Sub -------------------------------------------------------------

  • VBAのSheet.copyとsheet.selectについて

    For i = 1 To 50 Sheets(1).Select Sheets(2).Copy after:=Sheets(2) Sheets(1).Copy after:=Sheets(2) Next のようにして、Excelの2つのSheetを50セットコピーするとします。しかし、最初の何回かは成功するのですが、時々コピーが失敗したというダイアログが出て止まってしまいます。必ず止まるわけではないので原因が分かりません。 また、似たような理由で、 For x = 1 to 100 Sheets(2 + x).Cells(1, 1).Select With ActiveCell.Characters (Start:=9, Length:=2).Font .ColorIndex = 3 Next End With のように回していると、「Rengeクラスのselectメソッドが失敗しました」というエラーダイアログが出てしまうことがあります。成功する時は成功します。 どなたか教えてください。

  • excel マクロ 最終シートの後ろにシートを作成するには

    行いたいのは次の通りです。 ・全シート数は常に可変。 ・とあるシートをそのまま、現在作成されているシートの一番後ろに作成。 構文的には Sheets("Sheet1").Select Sheets("Sheet1").Copy After:=Sheets(3) ここの(3)を、変数にして、全シート数を代入してあげればうまくいきそうなのですが、全シート数を取得するコマンド等分からず行き詰っています。 何か、やり方を御存知の方がいらっしゃいましたら御教示ください。

  • エクセルVBAでSheet1.ActivateとSheet(n).Activate

    エクセル2000です。 VBAでの疑問点を教えてください。 Sub test1() Sheet1.Activate MsgBox ActiveSheet.Name End Sub これは問題なく作動します。 Sub test2() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheet(n).Activate MsgBox ActiveSheet.Name Next End Sub これは「SubまたはFunctionがていぎされていません」というエラーになります。 もちろん、 Sub test3() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets(n).Activate MsgBox ActiveSheet.Name Next End Sub のように書けばOKなのは存じておりますが、これではSheet名に係らず、左から順番となってしまいます。 Sub test4() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets("Sheet" & n).Activate MsgBox ActiveSheet.Name Next End Sub のように明確にシート名として記述すればOKなのですが、それでは、Test1のSheet1.Activate が通って、Sheet(n).Activate が通らないのはなぜでしょう? しょうもない質問でごめんさない。

専門家に質問してみよう