お世話になります。
エクセルのVBAにてリストボックスで選択した単語をシート名に
反映させるマクロを作成しました。
が、一度シート名を作ると2回目に同じ単語を選択すると、
デバック?画面になってしまいます。
『同じ名前のシート名は作れません・・・』
希望としては、同じ名前が出たら自動に連番が割り振られる
ようなものを希望しています。
マクロの記録で確認しても、やはり同じデバック要画面がでます。
別シートにシート名を反映させて、同じ名前がヒットしたら
文字列を追加して、そのシートに反映し続ける・・・
ようなことは考えられますが、どうも不細工で気が向きません。
もっとスマートな考えがあれば教えていただきたく
よろしくお願いします。
参考に作ったVBAを下記します。
これだと、途中でシートを削除してしまうと
デバック画面が発生してしまいます。
(マクロの切り抜きなので、
リストで選択したものが反映されるマクロではありません)
Dim シート名 As String
Dim n As Integer
Sheets("伝票マスター").Select
Worksheets("伝票マスター").Copy before:=Worksheets("伝票マスター")
n = Sheets.Count
Sheets("伝票マスター (2)").Select
ActiveSheet.Name = "伝票" & n - 1
Range("D2") = n - 1
Range("D1").Select
、
No.5ベストアンサー
- 回答日時:
こんばんは。
こんな感じにしたらどうでしょうか。
On Error GoTo で処理するほうが良いのですが、それを発生させるために、Active やSelect を使うと、画面が動きますから、WorksheetFunction で値を取ります。On Error Resume Next ですと、値が確保できませんから、Variant 型の変数の中に、Null 値を入れる方法を取りました。Null値はワークシートでは発生しません。別にどんな方法でもよいのですが、シートの位置に関係なくシート名をチェックしないとうまくありません。
ブックに伝票マスターがない場合の処理を入れておきました。
'-------------------------------------------
Sub Test1()
Dim i As Integer
Dim ret As Variant
Dim n As String
Const SHN As String = "伝票マスター"
On Error GoTo ErrHandler
Worksheets(SHN).Select
For i = 1 To ActiveWorkbook.Worksheets.Count
On Error Resume Next
ret = Null
n = "伝票 - " & CStr(i)
ret = Worksheets(n).Range("A1").Value
If IsNull(ret) Then Exit For
On Error GoTo 0
Next i
Application.ScreenUpdating = False
Worksheets(SHN).Copy Before:=Worksheets(SHN)
With ActiveSheet
.Name = n
.Range("D2") = i
.Range("D1").Select
End With
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
If Err.Number = 9 Then
MsgBox "アクティブブックには、" & SHN & "がないように思われます。", vbExclamation
End If
End Sub
'-------------------------------------------
ご回答、ありがとうございました。
また、返信が遅れまして、申し訳ございませんでした。
何とか、この構文を改良しながら達成することができました。
後は、この中身をよく理解し、自分のものにしたいと思います。
ありがとうございました。
No.4
- 回答日時:
選択したシート名が、今有るシート名と同じものが有るかチェックして、在れば別の名前にしたらしまいだと思うが、何が聞きたいのか。
ーー
(1)ダブっているかどうかのチェック方法?
(2)連番などをつける方法?
この点に関して>文字列を追加して、の具体的な例を挙げないとダメだ。
(1)について
Existsと言うような既製の関数は無い。自分でチェックするしかない。
http://exceltip.com/st/Determine_if_a_sheet_exis …
のような例が載っている
普通はFor Each でチェックすると思う。
ーーー
添え字的な部分が、数字なら(数字付加が一番易しいかな)、リストボックスに有る文字列で見つかった文字列を空白で置換して削除して、残りの数字を+1したものを付加して、シート名とする。などが思いつくが、たのばあいだとさらに面倒です。
現存するシートが集計表2ーーー集計表(リストボックスから)の部分を空白で置換ーー2が残る--2+1の3を付加ーー集計表3
もしこの線でやるとして、コード作成は大丈夫かな。
ご回答、ありがとうございました。
また、返信が遅れまして、申し訳ございませんでした。
皆さんのコメントを参考にしながら、何とか達成することができました。
(1)について知りたかったのですが、
何とか達成することができました。
コメント頂きありがとうございました。
No.3
- 回答日時:
入力された名前で、無条件にシートを作成する前に、その名前のシートが既にあるかどうか調べればよいのでは?
(作成してみて、エラーだったらエラー処理、という方法もありますが)
例えば、以下の関数へ新しく付けたい名前を渡すと、既にある場合はTrueが返されます。
なので、Trueの間は附番を大きくしていって、OK(False)ならその名前を採用するとか…
Function testSheet(newName As String) As Boolean
testSheet = False
For cnt = 1 To Worksheets.Count
If Worksheets(cnt).Name = newName Then testSheet = True: Exit For
Next cnt
End Function
なお、ご質問とは関係ありませんが、
Worksheets("○○").Copy before:=Worksheets("○○")
で新しくできたシート名を設定するのなら、これに続けて
ActiveSheet.Name = "△△"
みたいなほうが簡単だと思います。
ご返答ありがとうございます。
しかし、functionが何者かわからずに
ネットで数時間調べましたが、
(1)
sub()
・・・
end sub()
の次に続けて
Function testSheet(newName As String) As Boolean
・・・
End Function
と記述する。
(2)どうやら、newnameを変数とする
(1)のsub()の中でかぶる可能性のあるシート名を
newnameに代入する??
↑
この辺りがよく理解できませんでした。
(実際にやってみると、デバック要のポップが出現しました。)
非常に恐縮ですが、追記いただけないでしょうか?
No.2
- 回答日時:
こんばんは
選択した単語+連番
というルールがあるならば、シート名を適用する前に事前チェックできます。
一番手っ取り早いのは、
On Error Goto
を使う方法です。同じシート名があれば、エラーになりますから、そのときはエラー処理のルーチンを実行して、次の番号を試してみます。
気の利いた処理としては、エラーにならないように事前にチェックする方法です。
最初の「シート名」を単に「単語」にするよりも「単語名(0)」と番号を振ってしまう方がプログラムはスッキリします(最初の番号は0ではなく1でも構いません。)
具体的なプログラムも「こんな感じ」くらいには頭の中にあるのですが、ちゃんと動くか検証してみてから回答します。
ご回答、ありがとうございました。
また、返信が遅れまして、申し訳ございませんでした。
皆さんのコメントを参考にしながら、何とか達成することができました。
ON error gotoは、
ネットで調べたのですが、よく使い方がわかりませんでした。
他の構文を参考にこれから理解しようと思います。
No.1
- 回答日時:
ご回答、ありがとうございました。
また、返信が遅れまして、申し訳ございませんでした。
皆さんのコメントを参考にしながら、何とか達成することができました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) シート名を簡単に書く方法があれば教えてください。 4 2023/08/24 12:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
ハイパーリンクでジャンプした...
-
エクセル、特定のシートにパス...
-
エクセルの2つのシートを並び...
-
【ExcelVBA】マクロの入ったシ...
-
エクセルで複数のシートに画像...
-
【Excel VBA】データ貼り付け先...
-
Excel、Aのシートにあって、Bの...
-
エクセルのシート連番の振り直し
-
EXCELの図形(テキストボックス)...
-
エクセルでリンク貼り付けした...
-
Wordで差し込み印刷時に表示す...
-
Accessのテーブルを既存のExcel...
-
エクセルで誤ってF11キーを押す...
-
指定したシート名以外を非表示...
-
特定の複数のシートに同じ処理...
-
accessへエクセルの複数のシー...
-
エクセルを開くとメニューバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルで複数のシートに画像...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
ワークシートそのものの色を変...
-
【ExcelVBA】マクロの入ったシ...
-
ハイパーリンクでジャンプした...
-
エクセルのシート連番の振り直し
-
エクセル、特定のシートにパス...
-
エクセルの2つのシートを並び...
-
エクセルのシー名を二段表示に...
-
Wordで差し込み印刷時に表示す...
-
Accessのテーブルを既存のExcel...
-
【Excel VBA】データ貼り付け先...
-
EXCELの「シートの見出し」のフ...
-
EXCELの図形(テキストボックス)...
-
accessへエクセルの複数のシー...
-
アクセスからエクセルのシート...
-
特定の複数のシートに同じ処理...
-
エクセルで、シートの名前を変...
おすすめ情報