強制的にマクロを有効にするVBA
- エクセル2010でマクロを有効にするVBAについて教えてください。
- マクロの入ったファイルを開く際にマクロを強制的に有効にする方法や、複数のシートがある場合の修正方法についてお知りになりたいようです。
- また、マクロが有効になっていない場合は注意喚起のメッセージボックスを表示させる設定にすることは可能かもしれません。
- ベストアンサー
強制的にマクロを有効にするVBA
エクセル2010を使っている者です。 マクロの入ったファイルを開くときに、強制的にマクロを有効にするようなVBAは どのように組めば良いか、ご教授願います。 ネットで調べてみると、以下のものが見つかりました。 http://www.saka-en.com/office/vba-open-the-macro-enabled-forcibly/ 1 Option Explicit 2 3'** 4 ' ワークブックオープン 5'** 6 Private Sub Workbook_Open() 7 ThisWorkbook.Unprotect Password:="password" 8 On Error Resume Next 9 If ThisWorkbook.Sheets("編集用").Visible <> True Then ThisWorkbook.Sheets("編集用").Visible = True 10 If ThisWorkbook.Sheets("ダミー").Visible <> False Then ThisWorkbook.Sheets("ダミー").Visible = False 11 ThisWorkbook.Protect Password:="password" 12 'ThisWorkbook.RunAutoMacros Which:=xlAutoOpen 13 On Error GoTo 0 14 Exit Sub 15 End Sub 16 17 '** 18' ワークブックを閉じる前 19 '** 20 Private Sub Workbook_BeforeClose(Cancel As Boolean) 21 Dim Answer As Long 22' 保存されているかチェック 23 If ThisWorkbook.Saved = False Then 24 Answer = MsgBox("Do you want to save the changes to the '" & ThisWorkbook.Name & "' ?", vbExclamation + vbOKCancel, "Microsoft Excel") 25 Select Case Answer 26 Case vbCancel 27 Cancel = True 28 Exit Sub 29 End Select 30 End If 31 ThisWorkbook.Unprotect Password:="password" 32 On Error Resume Next 33 If ThisWorkbook.Sheets("ダミー").Visible <> True Then ThisWorkbook.Sheets("ダミー").Visible = True 34 If ThisWorkbook.Sheets("編集用").Visible <> False Then ThisWorkbook.Sheets("編集用").Visible = False 35 ThisWorkbook.Protect Password:="password" 36 ThisWorkbook.Save 37 End Sub しかし、このコードだと、編集するシートが1枚であれば良いのですが、何枚もある場合や、随時、シートを追加していくようなファイルの場合は修正が必要だと思います。 どのように修正すれば良いのでしょうか。 もしくは、例えば、マクロが有効になっていない場合は、ファイルは開けるものの、注意喚起のメッセージボックスを有効にするまで表示させるような設定にすることは可能でしょうか。 ご教授いただけると幸いです。 よろしくお願いいたします。
- qazxcvfr4
- お礼率91% (833/910)
- Excel(エクセル)
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。 最初に、そのマクロ自体は、試してみたのですか? ダミーだけ残して、後は、非表示にするというだけのことですから、そんなに、難しい話ではないと思います。ただし、二つの条件があります。 ・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの [マクロの設定]の「警告を表示せずにすべてのマクロを無効にする」という設定と、 ・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼する」にチェックを外していることです。 それで、マクロが動かないようにしている相手は、いずれにしても、その設定自体を変えてもらう必要があると思いますが、実際、そういう相手は、「マクロ」自体を使わないという規則があったりします。 それから、リンク先のデジタル署名については、Excel 2007以上は、厄介なものになってしまいますので、なるべく避けたほうがよいです。むろんCA認証を購入していたりするなら別ですが、たぶん、その辺りはお分かりになっていないと思います。(実際、プロになるつもりでなければ、知らなくて良いです。昔、MS側で試用認証を無料で配布されたような覚えがあるのですが、今は、結構値段の張るものになってしまいました。) >このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。 [プロテクトをなし]にしても、現行のプロテクトの設定なら、あまり大きく変わりません。 本来は、[シート構成]と[ウィンドウ]の両方をプロテクトして、始めてブックの保護が生きるはずです。 以下のマクロでは、この部分です。 .Protect PSW, False, True → .Protect PSW, True, True ただし、扱いが面倒になります。 そもそもの話になるのですが、そのコードは、Excel2003 時代に知られていたマクロです。ただし、リンク先のコードや文章の内容については、いくつか気になる点がないわけではないのですが、一応、コードの方はちゃんと動きます。 これ以上、ごちゃごちゃ書いたところで、あまり理解してもらえないような気がしますから、コードを残しておきます。もう、VBAは足を洗ったつもりで、最近、ほとんど書いていませんが、試しに書いてみました。 '// '-------- '注意:最初に、予めあるウィンドウのパスワードは空にしておいてください。 'その上で、マクロでパスワードを入れてください。現在の設定は、[シート構成]のみになっています。 'また、ダミーシートは必ず必要です。そこには、適当にメッセージを入れてください。 '最初に、マクロは起動状態にして、保存しないと正しい状態にはなりません。 '--------- 'ThisWorkbook モジュール Option Explicit Private Const PSW As String = "PWS01" 'パスワード Private Sub Workbook_Open() AlterVisSheet True Me.Saved = False End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) ' 保存されているかチェック With Me If .Saved Then Exit Sub Select Case MsgBox("Do You Want to Save Changes", vbQuestion + vbYesNoCancel, "Microsoft Excel") Case vbYes AlterVisSheet False Application.EnableEvents = False .Save Application.EnableEvents = False Case vbNo .Saved = True Case vbCancel Cancel = True End Select End With End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) With Me AlterVisSheet False Application.ScreenUpdating = False Application.EnableEvents = False .Save Application.EnableEvents = False AlterVisSheet True Application.ScreenUpdating = True Cancel = True End With End Sub Sub AlterVisSheet(arg As Boolean) 'arg = False 隠す; True 表示 Dim sh As Object With Me .Unprotect PSW If .Saved = arg Then .Saved = False On Error Resume Next For Each sh In .Sheets 'グラフシートも含める If Not sh.Name Like "ダミー*" Then sh.Visible = IIf(arg, xlSheetVisible, xlSheetVeryHidden) Else sh.Visible = IIf(arg, xlSheetVeryHidden, xlSheetVisible) End If Next sh On Error GoTo 0 .Protect PSW, False, True End With End Sub '//
その他の回答 (3)
- WindFaller
- ベストアンサー率57% (465/803)
補足です。 このマクロの仕組みは、 (0) 最初に、「ダミー」シートのみの状態で保存します。 (1) マクロが起動すれば、その「ダミー」シートは隠れて、他のシートが逆に現れます。 マクロが起動しなければ、本来は「ダミー」シートのみです。 この間に、マクロ・On の状態にするというのがふつうです。 (2) 終了時には、マクロが起動して、「ダミー」シートのみの状態に戻ります。 (ある意味で、ブックには、ここで変更が加えられます。) 完全に元に戻っていない状態で保存すれば、次回の起動で、元に戻っていない形で現れます。 ところで、マイクロソフト側では、 IRM(Windows Right Management) を薦めています。調べてみてください。 私個人は、実務では用いたことはないのですが、試験的には何度も使っています。 この機能は、使う人を限定するという考え方です。 残念ながら、Professional 版のみにしか機能はありません。 デジタル署名に関しては、昔は、それでも良かったのですが、現在では、最終的なブック の変更自体が利かなくなってしまいますので、お勧めできません。 今回のマクロは、結果的には、現状の方法では、私自身は、満足するものにはならないと思っています。
お礼
このマクロのしていたことが、ようやく少しわかりました。 すでに変更を加えてあるとはそういうことだったのですね。 また、先ほど、職場のPCと家のPCで動きが違った理由がわかりました。 IRMなる機能があるのですね。 今回は活用できそうにありませんが、覚えておきます。 ありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
最初に、私は、もう最近VBAそのものは書いていませんが、今回、たまたま、見覚えのあるコードでしたので、お話に乗っただけです。だから、あまり話を長引かされても、事情があって、ずっとお付き合いできそうにもありません。だからといって、私は、別の質問を立ててくれ、というようなことを言うつもりもありません。 現実に、この種のマクロが必要なのですか? 何か、デジタル証明についても、お聞きになろうとしていた様子でしたが。 単なるVBAの勉強ですか?何か、お困りのことがあるのですか? 私が、納得できるような条件のお話があれば別ですが、そもそも、とても実用的にはナンセンスなマクロだと思います。実際、マクロは使いたくないというユーザーに、Excelは使わせないというような目的のマクロでは、無理があります。 (1) ですから、基本的には、私は、このマクロを実用的に使っていただくつもりはないし、Excel 2003用のコードを、Excel 2010 で使用するには条件が違いすぎて、問題が残ると考えています。 #2の説明が悪かったようですが、マクロを無効にしても、マクロを利用するという変更をしてもらわないと、ダメだということです。 ・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの [マクロの設定]の「警告を表示してすべてのマクロを無効にする」という設定と、 ・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼することを許可する」にチェックをいれていること、 最終的には、こういう条件にしないと、マクロは結果的に動かないということです。 その上で、自分のPCで行う時には、信頼済みドキュメントをすべてクリアして、信頼されていない状態にする。[クリア(C)]をクリック。そして、マクロで終了させる、ということです。 >2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表示されてしまいます。 とおっしゃられても、おそらく、環境設定自体が違っているのだろうと思います。つまり、マクロ自体が動いていない状態で、保存しているようです。マクロ自体の理解が出来ていないからだと思います。 もともと、マクロはが動いていない状態で開くことであり、それで、マクロを稼働させて、オシマイということです。「毎回」という条件ではないのです。そこらがよくお分かりなっていないようです。 (2) は、表示そのものをコマンドで止めているはずで、そのようなはずはないはずですが、PCのスペックの問題かもしれません。しかし、これも、そもそもになるのですが、「ダミー」シートを残すという発想自体の切り替えをしなければならないはずです。リンク先では、1つでしたが、多数ある場合は、Windowの非表示に変えれば、シートの表示・非表示などの切り替えなどは発生しません。ただし、メッセージも見えません。 (3) >変更を加えていなくても閉じるときにメッセージが出るのですが、 それは、いずれにしても、マクロで変更している部分があるわけですから、その後に、Saved =True の部分を、入れればよいのだと思いますが……。これそのものが、基本的には、1回きりのマクロで、何度も使うことは想定されていません。 (4) >パスワードを設定してようですが、ブックを保護したり、解除したりするしている この話も、「そもそも論」になってしまうと思います。 すでに、この答えは、書いたはずですが、ウィンドウの構成などをユーザーにいじらせていいなら、ある程度のExcelの知識のある人なら、自由に扱ってしまうだけでなく、そのようなシートの表示・非表示のマクロそのものが不要なはずです。しかし、いずれ、ウィンドウを構成をいじれば、マクロ側にエラーが発生するわけです。 もう少し、大局的に考えてみたほうがよいと思います。
お礼
長引いてしまって、すみません。 今回も丁寧なご回答ありがとうございました。 同じマクロを職場のPCと家のPCで使ってみたのですが、なぜか動きが少し違いました。 ご指摘のとおり今回はこうしたマクロを使わない方法で対処することにしました。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 ご質問に書かれたマクロは、マクロが機能していれば、編集用のシートを表示し、そうでなければ、ダミーを開くというものだと思いますが、そのコードは、Excel 2010 では、1回きりのもので、「マクロの警告メッセージ」のチェックを、有効にしてしまえば、それ以降は、「信頼済みのドキュメント」になってしまい、以降は、そのまま通りますので、あまり使えるものではありません。過去のバージョンなら有効だとは思います。 >強制的にマクロを有効にするようなVBAは、どのように組めば良いか、ご教授願います。 しかし、それは、私には答えられません。それは、ここの掲示板のような公開された場所では、禁止された行為です。書けば、すぐに削除されるはずです。ワーム・ウィルスをそのまま向かい入れることになるからです。 掲示板の規約の[保護手段の回避技術公開につながる記述]に該当します。 >マクロが有効になっていない場合は、ファイルは開けるものの、注意喚起のメッセージボックスを有効にするまで表示させるような設定にすることは可能でしょうか。 それは、無理です。だから、ダミーシートに、「マクロを有効にしてください」などと、メッセージを書いているわけです。MsgBox そのものが、VBAで動くものですし、仮に、他のマクロ(Ver.4)でも、現在ではマクロの対象とされています。 質問のマクロをどのブックでも有効にするには、同じパスワードとシートを同じスタイルにしてやる必要あるものの、Personal.xlsm のクラスモジュールに、イベントを書いてやればできるような気がします。一つのブックならともかく、複数のものに設定することはやったことがありません。一回きりのものに、そのような大掛かりなマクロが必要かどうか疑問です。 '-------Class Module ------------- Private WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) ' ↓ End Sub 'ThisWorkbook側で Private Sub Workbook_Open() Set App = Application End Sub
お礼
おはようございます。ご回答ありがとうございます。 強制的に解除することはできないとのこと、承知しました。 >質問のマクロをどのブックでも有効にするには、同じパスワードとシートを同じスタイルにしてやる必要あるものの、Personal.xlsm のクラスモジュールに、イベントを書いてやればできるような気がします。一つのブックならともかく、複数のものに設定することはやったことがありません。一回きりのものに、そのような大掛かりなマクロが必要かどうか疑問です。 どのブックでも有効にしようとは考えているのではなく、1つの特定のブックのみ有効にしたいと考えております。 質問に記載したコードだと、シートが「ダミー」と「編集用」の2枚で構成されたブックであればよいのですが、私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。 ダミーのシートは最初の1枚目に追加すれば良いとして、質問に書いたコードを修正して使用することは可能でしょうか。 また、このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。
関連するQ&A
- エクセルのマクロを有効にしないと表示しないようにする方法
エクセルでマクロを有効にしないと、シートが表示されないように設定したいのですが、下記の様に(ほかの方の投稿から)入力すると三行目がエラーになります。素人なので、よくわかりません。どのようにしたら、マクロを有効にしないと全てのシートを表示しないようにできるのでしょうか? ご教授いただけますでしょうか Private Sub Workbook_BeforeClose(Cancel As Boolean) Sheets(\"Sheet1\").Visible = False Sheets(\"Sheet2\").Visible = False ActiveWorkbook.Protect Password:=\"error123\" End Sub Private Sub Workbook_Open() ActiveWorkbook.Unprotect Password:=\"error123\" Sheets(\"Sheet1\").Visible = True Sheets(\"Sheet2\").Visible = True Sheets(\"Sheet1\").Select End Sub
- 締切済み
- その他(業務ソフトウェア)
- エクセル・マクロでIf Thenの使い方
このような質問は、ルール(エチケット、マナー)違反になるでしょうか? もしそうならお許し下さい。 名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。 Private Sub CommandButton1_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = False Next End Sub Private Sub CommandButton2_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = True Next End Sub これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。 If Names.Visible = False Then If ThisWorkbook.Names.Visible = False Then If ThisWorkbook.tname.Visible = False Then Private Sub CommandButton3_Click() Dim tname As Name If Names.Visible = False Then 'これでは駄目 For Each tname In ThisWorkbook.Names tname.Visible = False Next Else For Each tname In ThisWorkbook.Names tname.Visible = True Next End If End Sub 苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。 Private Sub CommandButton3_Click() Dim tname As Name If Range("g1").Value = " " Then For Each tname In ThisWorkbook.Names tname.Visible = False Next Range("g1").Value = "1" Else For Each tname In ThisWorkbook.Names tname.Visible = True Next Range("g1").Value = " " End If End Sub ど素人ですがよろしくご教導ください。
- ベストアンサー
- オフィス系ソフト
- 仕事で使用しています。教えてください。
仕事で使用しています。教えてください。 エクセルの表でマクロを使用しているのですが、入力後保存して再度開くと入力できなくなってしまいました。 マクロ勉強中で、コピペしようしている為、どこがダメなのかがわかりません。 お分かりになる方、教えていただけますか? 現在使用しているマクロは Private Sub Workbook_Open() ActiveWorkbook.Unprotect Password:="8253" Sheets("日別管理").Visible = True Sheets("部門別").Visible = True Sheets("仕入原価").Visible = True Sheets("買掛").Visible = True Sheets("小口").Visible = True Sheets("一覧表").Visible = True Sheets("精算書").Visible = True Sheets("TOP").Visible = False Dim myWS As Worksheet For Each myWS In Worksheets With myWS .EnableSelection = xlUnlockedCells .Protect Password:="****", AllowFormattingColumns:=True, AllowFormattingRows:=True End With Next myWS End Sub Sub シートの保護() Dim myWS As Worksheet For Each myWS In Worksheets With myWS .EnableSelection = xlUnlockedCells .Protect Password:="****", AllowFormattingColumns:=True, AllowFormattingRows:=True End With Next myWS End Sub Sub シートの保護解除() Dim myWS As Worksheet Application.ScreenUpdating = False For Each myWS In Worksheets myWS.Unprotect Password:="****" Next myWS Application.ScreenUpdating = True MsgBox "シート保護解除しました。" End Sub 以上、3つです。 マクロを解除して使用してしまう方がいたので、マクロを使用してのみ使えるようにしたのですが…。 入力できなくなってしまいました
- 締切済み
- Visual Basic
- ■助けてください。■エクセルのマクロで困っています。
エクセルで、シートを一つ削除するマクロを教えてください。 本当に困っています。 マクロをご存知の方、ずぶの素人の私にご教示何卒よろしくお願いします。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 現在、これを応用して、すべてのシートを 削除するのではなく、ひとつのシートだけ削除したいのです。 例えば「SheetA」、「SheetB」、「SheetC」、「有効期限切れ」という 4つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 なお、エクセルファイルを開く際に、マクロを無効にされてしまうと 期日が来てもSheetCが削除されずに 残ってしまっては困るのです。 そこで、マクロを有効にしないと SheetCが現れないようにしたいのです。 (以下のマクロではそのようになっています) 一つだけシートを削除するマクロをやり方をご存知の方、マクロのご教示のほど 何卒よろしくお願い致します。 なお、小生、マクロはずぶの素人でして、 マクロの文面を頂いてコピー貼り付けするぐらいしか 能がありません。 つきましては、以下の文面を モディファイしてご教示頂けませんでしょうか。 よろしくお願いいたします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub
- 締切済み
- オフィス系ソフト
- コピペ,ドラッグ&ドロップをシート全体及び複数範囲指定で禁止したい
コピペ,ドラッグ&ドロップをシート全体及び複数範囲指定で禁止したい お世話になります。 上記の内容を実現したいのですが This Workbookには Private Sub Workbook_BeforeClose(Cancel As Boolean) Sheets("Sheet1").Visible = True Sheets("Sheet2").Visible = False Sheets("Sheet3").Visible = False Sheets("Sheet1").Select ActiveWorkbook.Protect Password:="123" ActiveWorkbook.Save End Sub ――――――――――――――――――――――――――――――――――――――― Private Sub Workbook_Open() ActiveWorkbook.Unprotect Password:="123" Sheets("Sheet2").Visible = True Sheets("Sheet3").Visible = True Sheets("Sheet2").Select Sheets("Sheet3").Select Sheets("Sheet1").Visible = False End Sub が入っていますがどのようにすればいいのでしょうか? ご教示お願いします。 ちなみにexcel2003です。
- ベストアンサー
- その他MS Office製品
- ■シートを一つ削除するマクロを教えてください。
前に、http://oshiete1.goo.ne.jp/qa4352149.html で質問させて頂きました。 その節は、お世話になりありがとうございました。 今回は、前回と似たようなものですが、 少々条件を変更したマクロを作成したいので ご協力のほど、何卒よろしくお願い致します。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 今度は例えば「SheetA」、「SheetB」、「SheetC」という 3つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 条件があり、「SheetC」は、マクロを有効にしないと使用できないようにしたいのです。 やり方をご存知の方、ご教示のほど 何卒よろしくお願い致します。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub
- ベストアンサー
- オフィス系ソフト
- エクセルVBAでShapesまたはDrawingObjects
シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub
- ベストアンサー
- オフィス系ソフト
- エクセル VBA SHeetの隠し
エクセルマクロでThisWorkbookの 記述に下記のようにしました! つまりSheet2を隠す為にしました! Sheet2はマスターなのでそこを使用者に 触らせないように!と思いしましたが・・・ いざ、ファイルを開くと{マクロを有効にする} をクリックしすと{編集の為にロックされています} と表示され読み取り専用になってしまいます! 記述が間違っているのでしょうか? しかもファイルを閉じるとエラー表示され エラーを報告を送信しますか?と必ず表示されます! 他のファイルは問題なく開いたり閉じたり出来ます。 やはり、記述の問題なのでしょうか? 教えて下さい! Private Sub Workbook_Activate() Dim Msg As String, Sn As Variant Sheets("入力").Visible = True Sheets("Sheet2").Visible = False Sheets("グラフ").Visible = True Sheets("入力").Activate UserForm1.Hide End Sub
- ベストアンサー
- オフィス系ソフト
- マクロを有効にしないと表示されないようにする方法(続き)
エクセルのマクロを有効にしないと表示しないようにする方法(続き) Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim i As Integer For i = 1 To 5 Sheets(i).Visible = False Next ActiveWorkbook.Protect Password:="error" ActiveWorkbook.Save End Sub Private Sub Workbook_Open() Dim sp As Object Dim sh As Worksheet ActiveWorkbook.Unprotect Password:="error" For i = 1 To 5 Sheets(i).Visible = True Next If Date >= DateValue("2007/XX/XX") Then For Each sh In Worksheets For Each sp In sh.Shapes sp.Delete Next sp sh.Cells.Delete Next sh End If Sheets("Sheet1").Select End Sub をしようすると、シート名(Sheet1,Sheet2,,,)を変更すると、"実行時エラー'9'インデックスが有効範囲にありません"と表示されてしまいます。解決策はありますでしょうか
- 締切済み
- Visual Basic
- エクセル2000でのVBAについて
下記のVBAを書いているのですが、3つのIF文を1つに まとめたいのですが教えてください。 If Range("E16") = "申請者" Then Sheets("ログイン").Select Sheets("報告票").Select ActiveSheet.Unprotect Range("M3:U7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("E16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("D3:L7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("F16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("BS3:CA7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select end if end if end if
- ベストアンサー
- Visual Basic
お礼
毎度、ありがとうございます。 書いていただいたコードで試してみたのですが、以下の点がうまくいかなかったり、 気になったりしました。 (1)初回はマクロが有効になっていない場合、ダミーのシートのみ表示されましたが、 2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表 示されてしまいます。 (2)ブックを開くときに、画面上でそれぞれのシートが目まぐるしく切り替わって開いていく。 (これはマクロである以上、不可避かもしれませんが) (3)変更を加えていなくても閉じるときにメッセージが出るのですが、通常のエクセル のように変更を加えているのにもかかわらず上書き保存をせずに閉じるときのみ メッセージを表示させることは可能でしょうか。 (4)パスワードを設定してようですが、ブックを保護したり、解除したりするしている のでしょうか。そこはなくしてしまっても良いのでしょうか。 お答えいただけると幸いです。 よろしくお願いいたします。