マクロ初心者です。
次のリストからマクロを実行した際にリスト名のシートを作成する方法を教えていただけないでしょうか。
A B C …
1 県名
2 北海道
3 青森
4 秋田
5 岩手
6 山潟
7 新潟
8 宮城
9 (空白)
10(空白)
1~10までのリストを以下のマクロで実行すると9と10が空白の為、「実行時エラー’1004’:アプリケーション定義またはオブジェクト定義のエラーです。」が実行後に表示されます。空白があってもエラーが出ないようなマクロを作成するにはどのようにしたらよいでしょうか?
また、実行後にリスト名が誤っていて再度マクロを実行した際に誤っているところだけ別にシートが作成されて誤っていないところはそのままというようなマクロは作成できるものでしょうか?
(例)A-6 山潟 → 山形に訂正し、再度マクロを実行した際に山形というシートだけが追加作成される。
Sub リストから連続シート作成()
Dim 県名 As Range
For Each 県名 In Worksheets("リスト").Range("A2:A10")
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = 県名.Value
ActiveSheet.Range("A1") = 県名.Value
Next 名前
End Sub
無理なことを言っているかもしれませんが詳しい方、どうかよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
こんばんは!
>空白があってもエラーが出ないような・・・
に関して
A2~A10セルと決まっているのですかね?
そうであれば
>For Each 県名 In Worksheets("リスト").Range("A2:A10")
の次に
>If 県名 <> "" Then
を
>Next 名前 ← Next 県名 では?
の前に
>End If
をそれぞれ追加してみてください。
次にシート名の変更についてですが、
Excel的には「山潟」は「山形」の間違いだという判別はできません。
どこかに正誤表があって、それを参照するのであれば可能です。
まずはこの程度で。m(_ _)m
早々に回答いただき、お礼が遅くなり大変申し訳ありませんでした。自分でも教えらてとおりやってみたらエラーが出なくなり、大変助かりました。
No.4
- 回答日時:
空白を判定するより、エラートラップしちゃった方が、良いような気がします。
シート名に使えない文字(例えば、"/")もあるので、すべて判断していると、気が狂いそうです(ちょっと大げさ)
こんな感じでです。
Sub リストから連続シート作成()
Dim 県名 As Range
For Each 県名 In Worksheets("リスト").Range("A2:A10")
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
On Error Resume Next
ActiveSheet.Name = 県名.Value
If Err.Number = 1004 Then
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
Else
ActiveSheet.Range("A1") = 県名.Value
End If
On Error GoTo 0
Next 県名
End Sub
このたびはご返事いただき大変有難うございました。
考え方でVBAの組み方もいろいろあるんだなと思って感心するばかりです。
これから僕も少しずつ勉強していきたいと思っています。
ご教授いただき、有難うございました。
No.3
- 回答日時:
こんばんは、
空白データの処理は、すでに回答されている通りIf文で条件分離すれば良いと思います。
しかし、
>実行後にリスト名が誤っていて再度マクロを実行した際に誤っているところだけ別にシートが作成されて誤っていないところはそのままというようなマクロは作成できるものでしょうか?
マクロは、プログラムなので、論理的説明が出来れば、作成は可能と思います。手法は別として。
ご質問の場合、何が誤りか?判断できない所が問題になります。。ですので、ご質問の流れを考え、誤っていると言うのは、
既存シート名と新規シート名(リスト)の差異を指しているものと推察します。
であれば、リストの内容と既存のシート名を照合して、シート名にあるものは、実行せず、シート名に無くリストにあるものを
シート名としてシート作成を行えば良い事になります。
疑問としては、いわゆる間違いと称するシートをどう扱えば良いかと言う事、削除してしまっても良いのでしょうか。
間違えにおそらく入力されているデータはどうするのか?まあ、それこそどこに移せば良いか判断が出来ないかと思いますが、、
なされたい事は、作成のみのようですね。
的外れかもしれませんが、サンプルを示します。ぱっと見、難しい内容になってしまったので、
もっと簡単に考えた方が良いのかも知れません。。取り敢えず、削除部分は、コメントアウトしてあります。
試す場合は、小さなブックで検証してください。
標準モジュールに、実行プロシージャは、 リストから連続シート作成()です。
Option Explicit
Sub リストから連続シート作成()
Dim myList(), mySht()
Dim Old_name As Variant, New_name As Variant
Dim i As Long, j As Long, LastRow As Long
With Worksheets("Sheet1")
'質問に合わせて10行目まで(コメント部は最終行
LastRow = 10 '.Cells(Rows.Count, 1).End(xlUp).Row
ReDim mySht(1 To Worksheets.Count)
ReDim myList(1 To LastRow - 1)
For i = 2 To LastRow
If .Cells(i, 1) <> "" Then
myList(i - 1) = .Cells(i, 1)
End If
Next
End With
For i = 1 To Worksheets.Count
If Sheets(i).Name <> "原本" Then
j = j + 1
mySht(j) = Sheets(i).Name
End If
Next
' On Error Resume Next
Old_name = AryCHK(myList, mySht) '削除の為のチェック
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' リストに無いシートを削除
' If IsArrayEx(Old_name) = 1 Then
' If Worksheets.Count > UBound(Old_name) Then
' Sheets(Old_name).Delete
' End If
' End If
Application.DisplayAlerts = True
New_name = AryCHK(mySht, myList) '作成の為のチェック
If IsArrayEx(New_name) = 1 Then
For i = LBound(New_name) To UBound(New_name) 'シート名にないシートをリストから作成
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = New_name(i)
ActiveSheet.Range("A1") = New_name(i)
Next
End If
Application.ScreenUpdating = True
End Sub
'配列に存在するかチェック(戻り値は存在しない値)
Function AryCHK(Ary, CHK) As Variant()
Dim i As Long, n As Long: n = 0
Dim varResult As Variant, return_Array()
For i = 1 To UBound(CHK)
varResult = Filter(Ary, CHK(i))
If UBound(varResult) <> -1 Then
Else
'Debug.Print CHK(i)
If CHK(i) <> "" Then
ReDim Preserve return_Array(n)
return_Array(n) = CHK(i)
n = n + 1
End If
End If
Next
AryCHK = return_Array
End Function
Function IsArrayEx(varArray As Variant) As Long
On Error GoTo ERROR_
If IsArray(varArray) Then
IsArrayEx = IIf(UBound(varArray) >= 0, 1, 0)
Else '1:配列;0:空の配列;-1:Not配列
IsArrayEx = -1
End If
Exit Function
ERROR_:
If Err.Number = 9 Then
IsArrayEx = 0
End If
End Function
このたびはご返事いただき大変有難うございました。
今回の質問でこんなに考えていただき有難うございました。
今回教えていただいたVBAの内容は初心者の僕にとってまだ理解できない
ですがこれから少しずつ勉強して皆様のように組めればいいなと思ってます。
大変有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Excel(エクセル) Excelのマクロについて教えてください。 4 2022/05/31 14:07
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) ExcelVBA ドロップボックスで月を選択するとそれ以降のデータが残るようにしたい。 3 2022/12/16 14:53
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/11 12:55
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロを複数シートに実行する...
-
コマンドボタンがデザインモー...
-
EXCEL 複数シートを1つの...
-
Excel:複数シートから条件に合...
-
VBAで条件によってシート見出し...
-
エクセルでシートの並び替えで...
-
Excelで,特定のシートを開いた...
-
VBA ワークシートオブジェクト...
-
エクセルで、マクロボタンの表...
-
Excel VBAで他のシートを印刷す...
-
エクセル シート保護をかける...
-
左隣のシートをコピーして挿入
-
メッセージボックスでシート名...
-
【 Excel】シートの見出しに自...
-
エクセル ヘッダー(フッター)...
-
マクロを特定の複数シートで実...
-
エクセルVBAでcmbBoxのプロパテ...
-
VBAであるマクロを全てのシート...
-
エクセル2013でマクロのボタン...
-
複数シートの保護・解除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロを複数シートに実行する...
-
コマンドボタンがデザインモー...
-
エクセルを開いたとき常に同じ...
-
【 Excel】シートの見出しに自...
-
エクセルでシートの並び替えで...
-
VBAで条件によってシート見出し...
-
EXCELでワークシートを開いたら...
-
EXCELでマクロを使わずに図形の...
-
マクロを特定の複数シートで実...
-
エクセルの複数のワークシート...
-
EXCELのエラー
-
複数シートの保護・解除
-
VBA シート名を先月の名前に...
-
エクセル2013でマクロのボタン...
-
VBAで作るexcel検索窓
-
EXCELの起動時に常に同じ...
-
シートを保護した時でも並べ替...
-
Excelで,特定のシートを開いた...
-
Excelのマクロの呼び出し元を知...
-
メッセージボックスでシート名...
おすすめ情報