[一覧]
[入門編1]
[入門編2]
[入門編3]
[実践編]
[トラブル編]
また、特定の名前定義を含むファイルは、マクロがあると判定されてしまいます。どういう判定をしているのかは知りません。
以下は、1文字と2文字の名前定義の例です。これ以外にも多数あります。
1文字の名前定義(この文字が全角文字3文字や5文字や7文字の中央にある場合も該当します。)
頁 項 順 頗 領 頚 頬 頭 頸 題 額 顔 願 類 風 飛 食 飢 飯 飲 飴 飼 飽 飾 報
2文字の名前定義(問題になるのは2文字目です。例えば、添付 還付 割付 なども該当します。また、全角文字4文字の3文字目や、6文字の4文字目にある場合も該当します。)
次へ 日付 送付 割勘 健忘 仕様 模様 泥濘 種痘 極秘 折釘 決闘 残高 金貸
この現象は不安定で、特定のシート名で必ずエラーになるわけでもありません。再現性の高いシート名は「マクロ01(全角)」「マクロ(半角)」「ModuleF(最後のFのみ全角)」などです。特に全角の英数字と半角カナが問題になっているようです。
一般的に、プログラムで使う識別子(プロジェクト名、モジュール名、プロシージャ名、変数名等)は半角英数字のみを使うことをおすすめします。その他の文字をサポートしている製品でも、バグや制限事項に引っかかる可能性があります。
グラフエリアの書式設定でフォントの[自動サイズ調整]をオフにし、目的のブックに直接グラフを作成するのではなく、作業用のブックに50個程度作成して目的のブックへシートコピーするという処理を繰り返すと、1つのブックに多くのグラフを作成することができます。ただし、本当に問題がないかどうか不安なので、おすすめはしません。
コレクションにオブジェクトが存在しない場合は実行しないようにします。
'すべてのグラフシートを削除するサンプルマクロ 'Application.DisplayAlertsの設定は必要に応じて行ってください Sub ChartsDelete() With ActiveWorkbook.Charts If .Count > 0 Then Application.DisplayAlerts = False .Delete Application.DisplayAlerts = True End If End With End Sub
なお、このマクロは非表示にするシートではなく、他のシートや他のブックに作成する必要があります。非表示にするモジュールシートに作成しても実行できません。
Sub Hide_Module() Workbooks("Book1.xls").Modules("Module1").Visible = xlVeryHidden End Sub
この問題はFindメソッドでも発生します。数値や日付の検索は、MATCH関数か、ループ処理を使う方が無難です。
Sub Test() Range("B3").Select Application.ExecuteExcel4Macro "DATA.FORM()" End Sub
'CSV形式のファイルを全フィールド文字列で開くマクロ Sub OpenCSVString() Dim vFileName As Variant Dim a(1 To 256, 1 To 2) As Integer Dim i As Integer vFileName = Application.GetOpenFilename(fileFilter:=StrConv( _ "テキスト ファイル (*.txt),*.txt,すべてのファイル (*.*),*.*", _ vbNarrow)) If VarType(vFileName) = vbBoolean Then Exit Sub For i = 1 To 256 a(i, 1) = i '列番号 a(i, 2) = 2 '列の属性(文字列) Next Workbooks.OpenText Filename:=vFileName, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _ Comma:=True, Space:=False, Other:=False, FieldInfo:=a End Sub
マクロの始めに ActiveCell.Activate などとして、ワークシートをアクティブにすることで回避できます。
標準モジュールにマクロを作成してWorkbook_Openから呼び出して実行すると回避できます。しかし、マクロでブックを開いた場合は、ユーザー定義関数の有無とは関係なく、やはりエラーにもならず、無視されてしまいます。
問題がこれだけかどうかも明確ではありませんので、従来のAuto_Openを使う方が無難でしょう。Auto_Openプロシージャは標準モジュールに作成する必要があります。
マクロでファイルを開き、Auto_Openを実行する場合は、RunAutoMacrosメソッドを使うのですが、これも期待通りの動作をしない場合があります。回避策として、Runメソッドを使い、"ブック名!Auto_Open"を実行するようにします。