
EXCEL2013を使用しています。
現在、以下のような構文を使用して、保存時に実行しています。
処理は、シート名を書き換えてシート保護をかけて先頭から9番目のシートのA1へ戻るようにしています。
これを、次のような処理にしたいと考えています。
1.シート名を書き換え
2.シート保護
3.先頭から9番目のシートから、31番目のシートをシート名でソート
4.マクロ実行前に作業していたシートへ戻る
ちなみに、書き換えたシート名が、"1.○○○" や、"2.△△△"などになっているのですが、"."より前の値で並び替えられると便利になります。
また、デフォルトのシート名のままのものと、書き換えられたものがあり、書き換えられたものにだけ"."つきのシート名になります。
よろしくお願いいたします。
*******************************
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'画面のちらつき防止
Application.ScreenUpdating = False
'シート名更新
For i = 1 To Sheets.Count
Sheets(i).Select
Sheets(i).Name = Range("A1").Value
Next i
'全シート保護
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Protect Password:="aoken", _
DrawingObjects:=False, _
Contents:=True, _
AllowInsertingRows:=True, _
AllowDeletingRows:=True, _
Scenarios:=True, AllowFormattingCells:=True
Next ws
Application.Goto Sheets(9).Range("A1"), True
End Sub
*******************************
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんばんは。
>順番にするのは難しいでしょうか?
そんなことはありませんが、質問のコードを書いた人が、シャチ君さんなら、お気づきではなかったでしょうか。半角にして、数字を取り出せばよいわけです。StrComv --vbNarrow, Val は、先頭から数字だけを出すもので、文字列はなくなってしまいます。
つまりここの部分ですね。
If Val(Worksheets(j).Name) <> 0 And Val(sName) <> 0 Then '数値の比較か?
If Val(Worksheets(j).Name) < Val(sName) Then '数字を取り出す
**
このように半角にして比べれば、数値の比較は同じ並びになります。
If Val(StrConv(Worksheets(j).Name, vbNarrow)) <> 0 And Val(StrConv(sName, vbNarrow)) <> 0 Then
If Val(StrConv(Worksheets(j).Name, vbNarrow)) < Val(StrConv(sName, vbNarrow)) <> 0 Then
p.s.シートの並べ替えは、マクロ1年生ですと、やはり難しいですね。これは、手の内を明かすと、アルゴリズムのバブルソートという名前のテクニックを利用したものです。
No.1
- 回答日時:
こんにちは。
>ちなみに、書き換えたシート名が、"1.○○○" や、"2.△△△"などになっているのですが、"."より前の値で並び替えられると便利になります。
つまり、先頭の1. 2. が優先させられることになるのですか?文字列比較ですと、1の次が11 などが先になってしまうはずです。それを、数字で比較するようにしました。
質問のコードの様子ですと、BeforeSave イベントへの組み込み方はお分かりになるレベルだと思いますから、ソートの部分だけを提示します。以下のコードは、昔作ったもので、私のオリジナルのはずです。
'//
Sub Sample_SortWorksheet()
Dim sName As String
Dim iCount As Integer '念のためInteger型のままにしておく
Dim acsh As Worksheet
Dim i As Long
Dim j As Long
Set acsh = ActiveSheet
'Application.ScreenUpdating = False
iCount = Worksheets.Count
For i = 9 To iCount - 1 '9番目シートからの並べ替え/その前は手付かず
sName = Worksheets(i).Name
For j = i + 1 To iCount
If Val(Worksheets(j).Name) <> 0 And Val(sName) <> 0 Then '数値の比較か?
If Val(Worksheets(j).Name) < Val(sName) Then '数字を取り出す
sName = Worksheets(j).Name
End If
Else
If Worksheets(j).Name < sName Then 'それ以外の文字の比較か?
sName = Worksheets(j).Name
End If
End If
Next
Worksheets(sName).Move before:=Worksheets(i)
Next
acsh.Select
'Application.ScreenUpdating = True
End Sub
'///
早速の回答ありがとうございます。
これを、もう少しアレンジすれば、思った通りの挙動になりそうなのですが、この構文だと問題点が2つ発生しました。
① 10.がソートされない。
シート名に"1.○○○" や、"2.△△△"と番号を振っているのですが、十番目のシート名は、”10.□□□”なのですが、このシートがソートされません。
② 番号を振っているシートが一番最後に配列されてしまう。
"1.○○○"のように番号の振られたシートが後尾に配列されてしまうようです。
"1.○○○"を9番目のシートから並べることはできますでしょうか?
ちなみに、ブックによって、1.~10.だったり、1.~3.までしかなかったりします。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) vbaで列幅について 1 2022/11/15 08:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- その他(Microsoft Office) エクセル VBAについて 2 2022/09/21 22:21
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
フォルツァ バッテリーを外して...
-
括弧があるとHYPERLINKで飛べな...
-
XR250BAJAのシートのはずし方を...
-
建築模型、カーブの作り方
-
軍事車などが覆っている、シー...
-
車のシートがへたってきました...
-
カッティングシートの上からア...
-
原付 レッツシート開け方
-
ホンダジョルノのイス シート...
-
水の染み込んだバイクのシート...
-
リアシート無しで運転してたら...
-
飛行機の座席について 3列シー...
-
エスティマのコンソールボック...
-
TEINのFLEXZに関しての質問です...
-
バイクのシートに傷
-
ホワイトボードの復活
-
はじめまして。古いクレアスク...
-
エクセルVBA:他シートを選択す...
-
95年式 Audi A6について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
括弧があるとHYPERLINKで飛べな...
-
原付 レッツシート開け方
-
BRIDEのシート張り替えってでき...
-
電車のシートって何でこんな暑...
-
ポケットにミシンでワッペンを...
-
エクセルVBA 4行飛ばしで転記す...
-
車のシートがへたってきました...
-
フォルツァ バッテリーを外して...
-
IHクッキングヒーターの操作パ...
-
Excel複数シートから日付と文字...
-
シートベルトの固定解除
-
中学生です。体育館の床に敷く...
-
リアシート無しで運転してたら...
-
癒着してしまったテレビの液晶...
-
台所流しの水音を小さくしたい
-
マジェスティ(4HC)のシート下...
-
水の染み込んだバイクのシート...
-
Excel VBA シート名変更時、重...
-
Google スプレッドシート:FILT...
おすすめ情報
さらに補足いたします。
実は、"1.○○○" や、"2.△△△"の一ケタの数字は、2バイトの全角なのです。"10.□□□"は、1バイトの半角数字なのです。
これを、順番にするのは難しいでしょうか?