Excel2000
Win2000
複数(最低5)のシートが存在するExcelのBookでExcelのVBAを使用して
strSheetName="XXX1"
intSheetNo = 1
Sheets(strSheetName).Copy after:=Sheets(intSheetNo)
とシートのコピーをしています。
この時コピーされたシートのインデックスが2にならないんですが、何故なんでしょ?
やりたい事はコピーしたシートの名前をExcelが勝手につけた名前から変更したいんです。
コピーされたシートのインデックスが2になると思っていたので上手く行きません。
Sheets(intSheetNo + 1).Name = "XXX1-1"
No.9ベストアンサー
- 回答日時:
INOPIIさん、StudyVBAさんへ
もう、INOPIIさんも、StudyVBAさんは、お分かりにはなっているはずですが、一応、念のために、レスをつけておきます。
>質問者のコードが引用されていますので、そこだけ読むと質問者のコードではダメ
>ですよ、
>というふうに取れ、No.4の回答と矛盾するようにかんじるのですが、
私は、INOPIIさんの着目している点は、私が以前指摘されたこともあって、直感的に分かりました。INOPIIさんの状況も正しければ、他の方が、Index が 2 になることも正しいと思いましたが、他の方のご指摘になっているものと、INOPIIさんの条件が違うということですね。
これは、最初の #1 のBLUEPIXY さんの回答をずっと追いかけていたのです。
# SheetsのIndex は、Index でしかありません。示されたコードで、何の問題もありません。
ただし、そのシート名とIndex は、つながらないっていう話を#4 で書いて、#6 で実証しようとしたのです。
StudyVBAさんもお分かりになっているとおりなんです。
>シート名が「Sheet1」だからといってインデックスも「1」とは限りませんよ
>と受け取りました。
今回、私自身も新たな発見をしました。
>シートのコピーを実行すると「Message」シートの後ろにコピーされているようでした。(Visible=Trueが「Message」シートだけなので当たり前なのかな?)
私は、考えても見ませんでした。非表示は、まず、一番最後にまわすのと、最終段階のブックでつけるので、そういうことはやったことがないのです。たぶん、私も新たにコードは考えられるかもしれませんが、もう、分かっていらっしゃるようですね。
つたない私の説明で、お分かりになりにくかったかもしれませんね。
この回答への補足
まだ、何故そうなってるのか分かっていないので、
これから調べる所です。
ただ、ここはもう閉じようと思います。
非表示にしたのは、多分(PGさんが作ったのを連休を使ってテストしていたので・・・)シートが色々切り替わって目障りなのでそうしたんだと思います。
No.10
- 回答日時:
おはようございます。
Wendy02さん、わざわざの回答ありがとうございます。
当方の読解力不足でご迷惑をお掛けしました。
これからも惚けた質問をすると思いますが
今回同様、宜しくお願いいたします。
それにしても本来のINOPIIさんの質問ですが、
シートが非表示になってるとは思いもよりませんでした。
色々勉強になることばかりです。
この回答への補足
私は構わないと思います。
もし、後で見る事があった時に疑問があっても、もう聞けないですから。
言葉だけでやってるので、伝わらない所がでるのはしょうがないですし。
画像がUPできると楽になる部分も多いんですけどね。
まぁ、他の人は分からないんで、難しいですが(笑)
No.8
- 回答日時:
INOPIIさん、こんばんは。
補足読みました。
そうですよね。
それから、質問者の了解を取らずに便乗質問したことお許しください。
先ず、断りを入れてから質問するべきでした。
以後気をつけます。
Wendy02さん、アホウな質問、すみませんでした。
No.7
- 回答日時:
こんばんは。
Wendy02さん、またまた疑問符ありです。ご教授ください。
No.4 の回答で
>示されたコードで、何の問題もありません。
と書いておられるのに
No.6 の回答では
>だから、結果的に、
>strSheetName="XXX1"
>intSheetNo = 1
>Sheets(strSheetName).Copy after:=Sheets(intSheetNo)
>Sheets(strSheetName) ←→ Sheets(intSheetNo)
とは、シート名と、Index とは、同時に扱えないわけです。
と書いておられますが、質問者のコードが引用されていますので、そこだけ読むと質問者のコードではダメですよ、
というふうに取れ、No.4の回答と矛盾するようにかんじるのですが、
No.6で仰りたいのは、シート名とシートのindexは必ずしも同じではないということだけですよね。
宜しくお願いいたします。
No.6
- 回答日時:
#1 のBLUEPIXY さんのテスト・コードを、もう一度、詳しくさせてみました。
Sub test()
Dim i As Long
Debug.Print "Index: Sheets.Name: ObjectName"
For i = 1 To Sheets.Count
Debug.Print Sheets(i).Index; " : "; Sheets(i).Name; " : "; Sheets(i).CodeName
Next i
End Sub
※わざと、Sheet1 と Sheet3 を入れ替えたブック。
ObjectName= CodeName = WorksheetName
挿入前
Index : Sheets.Name : ObjectName
1 : Sheet1 : Sheet3
2 : Sheet2 : Sheet2
3 : Sheet3 : Sheet1
4 : Sheet7 : Sheet7
挿入後 Sheet1-1 を挿入したら、
Index : Sheets.Name : ObjectName
1 : Sheet1 : Sheet3
2 : Sheet1-1 : Sheet4
3 : Sheet2 : Sheet2
4 : Sheet3 : Sheet1
5 : Sheet7 : Sheet7
Indexは、間違いなく、2になります。作った順序ではありません。
当然、シート名は、きちんと並んでいるという条件になりますね。
>シートのインデックスは視覚的に並んでいる順番ではなく
私は、それはみたとおりに並んでいる順序だと思いますね。
シート1 をシート3 の後ろに移動させたら。
Index: Sheets.Name: ObjectName
1 : Sheet1-1 : Sheet4
2 : Sheet2 : Sheet2
3 : Sheet3 : Sheet1
4 : Sheet1 : Sheet3
5 : Sheet7 : Sheet7
この状態で、枝番シートを挿入したら、通常のコードでは、Index は、5 になりますね。
Index: Sheets.Name: CodeName
1 : Sheet1-1 : Sheet4
2 : Sheet2 : Sheet2
3 : Sheet3 : Sheet1
4 : Sheet1 : Sheet3
5 : Sheet1-2 : Sheet4
6 : Sheet7 : Sheet7
だから、結果的に、
>strSheetName="XXX1"
>intSheetNo = 1
>Sheets(strSheetName).Copy after:=Sheets(intSheetNo)
Sheets(strSheetName) ←→ Sheets(intSheetNo)
とは、シート名と、Index とは、同時に扱えないわけです。
この回答への補足
お返事遅くなって申し訳ないです。
今日1日コード追ってました。
私の現状認識が甘く質問の仕方が悪かったみたいです。
ちょっと不安ですが結果的には解決しました。
状況
Index:SheetName:ObjectName
1 :xxx1 :Sheet1
2 :check1 :Sheet3
3 :Message :Sheet7
4 :check2 :Sheet4
5 :work1 :Sheet2
SheetName「xxx1」をコピーして「xxx1-1」とする。
元々「xxx1-1」がある場合は「xxx1-2」とする。以下順に名前の枝番(-n)を増やす。
SheetName「xxx1」はそのまま残す。
コピーする対象シートはシート「work1」に記載してあり、複数ある場合がある。
シート「check1」「check2」「Message」「work1」は順番は決まっていない。
想定結果
Index:SheetName:ObjectName
1 :xxx1 :Sheet1
2 :xxx1-1 :Sheet8
3 :check1 :Sheet3
4 :Message :Sheet7
5 :check2 :Sheet4
6 :work1 :Sheet2
の予定が
実際の結果
Index:SheetName:ObjectName
1 :xxx1 :Sheet1
2 :xxx1-1 :Sheet3
3 :Message :Sheet7
4 :xxx1(1) :Sheet8
5 :check2 :Sheet4
6 :work1 :Sheet2
となり「xxx1(1)」が残り「check1」のシート名が変わってしまっていました。
色々調べてみたら、最初の状態の時にIndexの2~5が非表示(Visible=False)となっており
コードが実行されると「Message」シートが表示され他のシートはすべて非表示と
なっていました。
で、シートのコピーを実行すると「Message」シートの後ろにコピーされているようでした。
(Visible=Trueが「Message」シートだけなので当たり前なのかな?)
ScreenUpdating = False だったので気がつきませんでした。
なので、「Message」シートを表示する時にすべてのシートを表示してから
シートのコピー→名前の変更をしたら上手くいきました。
みなさんのコードを見てるともっと良いやり方もありそうですが、時間が無いのでこれで行こうと思っています。
No.4
- 回答日時:
>コピーされたシートのインデックスが2になると思っていたので上手く行きません。
私も、以前混同していたことがあります。SheetsのIndex は、Index でしかありません。示されたコードで、何の問題もありません。
しかし、それは、あくまでも VBProjects 上のObject名とIndex の相関性があるだけであって、シートのプロパティ名とは直接関係がありません。
お出しになったコードを元に、試しに、以下のようなコードを書いてみました。
Sub SheetCopyW()
Dim num As Variant
Dim MaxNum As Integer
Dim i As Long
Const strSheetName As String = "Sheet1"
On Error GoTo ErrHandler
For i = 1 To Sheets.Count
With Sheets(i)
If .Name Like strSheetName & "-*" Then
num = Mid(.Name, InStr(.Name, "-") + 1)
If Val(num) > MaxNum Then
MaxNum = Val(num)
End If
End If
End With
Next
If MaxNum > 0 Then
Sheets(strSheetName).Copy After:=Sheets(strSheetName & "-" & CStr(MaxNum))
Else
Sheets(strSheetName).Copy After:=Sheets(strSheetName)
End If
ActiveSheet.Name = strSheetName & "-" & CStr(MaxNum + 1)
On Error GoTo 0
Exit Sub
ErrHandler:
MsgBox "Error " & Err.Number & " (" & Err.Description & ") "
End Sub
この回答への補足
コードありがとうございます。
テストしてみたんですが、Sheet1が非表示の時に
1回目は上手くいくんですが、2回目から上手く行きませんでした。
なぜ上手く行かないのかも良くわかりませんでした。
結果と詳しい事はNo6さんの補足に乗せさせてもらいました。
No.3
- 回答日時:
>この時コピーされたシートのインデックスが2にならないんですが
で、どうなるんですか?
それを書かないと、No.1さんも回答されてるとおり
提示されたコードであれば上手く行くはずですから
この質問を読んだ人にとってはどんな状況なのか
見当もつきませんよね。
No.1
- 回答日時:
ExcelXP(2002)
WinXPPro
では、質問文のコードでうまく実行できました。
シートNo1のシートの後に挿入はされているんですよね。
コピーされたシートのインデックスはいくつになっているんでしょうか?
イミディエイトウィンドウで
for i=1 to sheets.Count : ? i;":";sheets(i).name : next
とかやってみたらどうなりますか?
この回答への補足
なぜだかよく分かっていないんですが、
上手く行くBookと行かないBookがあるんです。
なので、割りつくIndex番号もばらばらです。
詳しくはNo.6さんの補足に書かせていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別ブックからシートのコピー 3 2022/04/01 20:07
- Visual Basic(VBA) 最終行の指定について教えてください。 複数シートを1シートへまとめる下記マクロでは各シートの6行目を 1 2022/10/04 18:37
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- Excel(エクセル) Excelにて、行の最後のセルの値をコピーして別sheetに張りつけるVBAコードをご教授願います 3 2022/11/20 14:35
- Excel(エクセル) マクロVBA別Excelブックにデータ転記 2 2022/07/10 23:35
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/03/25 08:33
- Excel(エクセル) 複数のExcelブックのシート1の内容を1つのExcelブックにコピー貼り付けたいのでvbaコードを 7 2023/02/10 23:20
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
ExcelのVBAのマクロで他のシー...
-
エクセルで特定のシートのみ自...
-
Excelマクロのエラーを解決した...
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
ワークシートを追加したときの...
-
ユーザーフォームに入力したデ...
-
ブック名、シート名を他のモジ...
-
集計シートA列のコードと一致す...
-
実行時エラー1004「Select メソ...
-
VBAで、シート間の転記するコー...
-
エクセルVBA Ifでシート名が合...
-
【VBA】色のついたシート名を取得
-
VBA 検索して一致したセル...
-
シート削除のマクロで「delete...
-
API関数ImmSetConversionStatus...
-
ExcelVBA:複数の特定のグラフ...
-
コード名シートA列と集計シート...
-
エクセルのシート名変更で重複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報
