• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel2003で開発したVBAを2000で使用したいのですが・・・)

Excel2003で開発したVBAを2000で使用したいのですが・・・

このQ&Aのポイント
  • VBA初心者です。Excel2003で顧客データベースを作成していますが、2000で使用する際に問題が発生しています。
  • Excel2003で作成した顧客データベースのVBAをExcel2000で利用する方法について教えてください。
  • VBAの初心者です。Excel2003で顧客データベースを作成し、2000で使用する際に書式設定の問題が発生しました。対処方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。Wendy02です。 >Pass解除はWorkbooks.open FILENAME,Password:="xxx"と記述しましたが、Open後にxlSheetVisibleを実行してシートを呼び出そうとする時にエラーが出ました。 それは、このせいでしょうね。 ActiveSheet.Visible = xlveryVisible xlveryVisible というプロパティはありませんから。xlSheetVeryHidden とか、xlSheetHidden などですから。 それで、#5 で書いたように、今、Excel 2000 で試してみました。 >この一連の処理はPass入力のboxを出さず、「B」を直接クリックして開こうとした時にLockをかけたいんです。 以下は、わたし流の書き方にはなりますので、ご自由に改変してください。これで問題なく開けられるはずですね。 Sub TestBookOpen() Const FILENAME As String = "TEST1a.XLS" 'ブック名 Const PSW As String = "chk" 'パスワード With Workbooks.Open(FILENAME, Password:=PSW, WriteResPassword:=PSW)  .Worksheets("Sheet1").Protect , UserInterFaceOnly:=True End With 後は、全体の流れは読みましたが、特に、大きな問題は発生しないと思います。 ただ、強いていうと、ActiveSheet は、見えてこないのですが、やはりコードとしても、そこは、こちらからすると、不安は残ります。問題がなければ、それはそれでよいのですが、なるべく、Worsheets("○○○") というような統一したコードの書き方の方が、ご自身も後々読みやすいかと思います。

itashin
質問者

お礼

Wendy02さん、こんにちは。返事が遅くなって申し訳ありません。 やっと意図していたことが出来ました。 Bのシートは予めxlSheetVeryHiddenで隠し、Bookの保護でシート構成、ウィンドウをロックした状態にしました。AのユーザーフォームからBを開き、ロックを解除してからBの20枚あるシートをxlSheetVisibleでいっぺんに再表示(この時点ではApplication.Left=-Application.widthで画面からは見えない)し、シートをアクティブにして書式設定や印刷をする事ができました。ありがとうございました。 そこで、大変恐縮なのですが、もしよろしければ以前に話の出ましたフリーズの件も引き続きご相談させていただきたいのですが、よろしいですか? ご参考までに、入力は全てユーザーフォーム上に配置したTextBox等のプロパティのcontrolsourceを使用してセルとリンクする方式で行っています。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。Wendy02です。 最初に、Excelのメモリの、ヘルプに出てくる「使用可能メモリに依存」のメモリは、物理的メモリではなくて、仮想メモリです。そこに展開されています。だから、ある程度は、コンパネからは、大きさの自由が利きますが、Excelのために、そういうところをいじるのは芳しくないように思っています。 >これは例えばTextboxのchangeイベントやclickイベント、又はユーザーフォームのイニシャライズイベントとして実行するコードを書けばいいという事で宜しいですか? たぶん、Initialize でいいと思います。今のところ、Initialize でしかありませんね。Activate は、逆効果ですから。 プロパティにあらかじめ設置させているよりは、プログラムで、ControlSourceのアドレスをテキストで入れていくのだから、負担は減ると思うのです。本当は、UserForm はひとつで、コントロール類は、ラベルなどの表示が変わるだけにするのが一番だと思います。 後は、もしも、同じようなコードがあったら、それらは、全部、標準モジュールに移して、UserForm からは、Call で呼び出すようにする方法が、考えられますね。

itashin
質問者

お礼

Wendy02さん、お返事が大変遅くなりまして、申し訳ございませんでした。 今、Wendy02さんのご進言に基づいて色々試しているところです。 時間が掛かりそうな感じですので、今回、ひとまずこのスレッドは締め切りとさせていただこうかと思います。 色々とお世話になりまして、本当にありがとうございました。また何かあった際にはHelpをお願いするかもしれませんが、そんなときはよろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。Wendy02です。 そのフリーズの問題ですが、実際に、どの程度、一つのユーザーフォームで、メモリを取っているのとかを調べてみないといけないのかなって、ふと思ったのです。通常は、メモリ保護が働くはずですが、ハングするのだから、容赦なく、メモリを上限まで使い切ってしまうのでしょうね。あれこれ、考えがまとまらないのです。もちろん、Excel2000 というところが、また一つのネックですね。 確かに、ControlSource は、そういう場合、有効だと私自身も思います。それは、インタラクティブですからね。今まで、私は、ControlSource 指定という方法は、意外に経験が少ないのです。TextBox のイベントから、セル指定して代入とかいう、場当たり的な方法です。しかし、数が増えると、結果的には、それは満足いけるものではありませんでした。時として、ユーザーフォームから代入値の反応の遅さが気になりますので、ControlSource のほうが軍配は上がるのですが……。ちょっと、別の人のエラーで思い出したけれども、もしかしたら、ControlSource って、それをあらかじめ指定しておくと、Rangeオブジェクトを抱えているのと同じことになるのではありませんか? それは、最悪なんですよね。できれば、その部分は、使わないときは、空にして、その都度、VBAで書き込んであげるようにしないといけないわけです。VBE は、常にコードが監視状態にあるのです。だから、使っていないコードでも、負担になっています。その分だけ負担になっているということです。そこが、VBAの最大の欠点です。 本当に、考えがまとまらないというか、それは、本当に実務の世界の話なので、#3 でも書いたように、実践の話は、コードがどうのこうのということではないので、とっても難しいです。それは、実験の繰り返しですね。スモールサンプルで、実験を繰り返して、本物に組み入れていく方法を私はとっています。状況は把握しているつもりです。 アイデアとしては、ユーザーフォームの使いまわしはできないか、ということ-つまり、上記のように、その都度、VBAでControlSource も入れてあげていくわけです。 もう一つは、「スプレッドシートオブジェクト」を思い切って使ってみるか、ということですね。どっちも、いまさら、加工したくないって思われるでしょうけれど……。そのままでは、解決の目処が厳しいですし、大幅な改編をしないと、メモリなどの問題は解決しないでしょうね。(メモリと決め付けてしまっているようですが、そこもあやふやです) 私個人は、Excel自体の本体があれば、ユーザーフォームを使わないで、入力数が少し多くなると、シートの入力に、別のブックの小窓のシートで処理してしまう方法を使ってしまいます。 まとめられずに書いてすみません。

itashin
質問者

お礼

Wendy02さん、こんばんは。引き続きご回答いただきまして、本当にありがとうございます。 >容赦なく、メモリを上限まで使い切ってしまうのでしょうね 確かに、18枚のユーザーフォームを使用していて次の項目入力の際に1度入力済みのフォームはUnlosdしているとはいえ、フォーム1枚に100個のオブジェクト(ラベル含む)が設置してあります。それに、TextBoxに文章を何百文字も打ち込む場合もあり、ControlsourceプロパティがもしRangeオブジェクトを抱えているのだとすれば確実にそれは負担になっていますね。 >その都度、VBAでControlSource も入れてあげていくわけです。 これは例えばTextboxのchangeイベントやclickイベント、又はユーザーフォームのイニシャライズイベントとして実行するコードを書けばいいという事で宜しいですか?今までコマンドボタンのclickイベントしか使った事が無いのでまだ未知の領域ですが、試してみます。 実はですね、開発初期にはデータ量も今の1042項目の3分の1程度だったんです。毎月現場の職員と打ち合わせをする度にあれもこれもと項目や機能が追加されて現在の形になったんです。ですから、データベース内の項目の並び順も滅茶苦茶ですし、整理できていないので追加や変更の時には決して効率が良いとは言えません。今回形が固まったら、ある程度期間をおいて大幅な改良をしなければとも考えていたところです。 一応現在Excel2000用とExcel2002以降用の2パターンで配布しています。2002以降用はBookの自動保存を停止した形で、少し負荷を減らして配布しています。メモリも512MB以下ではなるべく使用しないように通達しています。ちなみに、Vistaの2007では、ユーザーコマンドバーがmsoBarFloatingなのにアドインのリボンに格納されてしまうという事以外はサクサク動いているみたいなので(互換モードですが)やっぱりメモリが原因かもしれませんね。 いつもWendy02さんのご回答を読ませていただくと色々な事に気付かされます。ありがとうございます。引き続き宜しくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。Wendy02です。 >やりたい事ばかりが先にたち、理屈を理解せずにここまで来てしまったので、これを機会に1から勉強し直してみたいと思います。 ここまで来たのでしたら、立ち止まらず、先に行きましょう。(^^; ただ、一通りの抜け落ちはないようにしないと、抜け落ちたところが、ネックになることがあります。 たとえば、動的配列や多次元配列や引数の値渡し・参照渡しなど、あまり実務的には関係ないことなのですが、ここのカテゴリをみてて、そういう抜け落ちしている人が、やはり目だってしまいます。もう少し、我慢すればよいのにって思ってしまいます。それが、何になるわけではありませんが、知らないのと知っているのでは、少しだけ、コードとして違ってきてしまいます。 私は、初心に戻って、まったく新しい言語を、初歩の初歩から取り掛かっています。それに、結構、新しいことに挑戦するって、プレッシャーが掛かりますね。でも、勉強していて、なぜか、そのプレッシャーを楽しいと思うのです。その感覚が新鮮なのです。 今は、出来ないけれども、きっと、この先には答えがあると信じて、先に進むようにしています。出来るようになるかはまったく分かりません。ただ、上達は、現状に満足するのか、ともかく先に進むかの、ほんのちょっとの気持ちの違いじゃないかなって思っています。 そういいながら、私は、VBAは、中途半端になってしまいました。VSTO を購入するお金もなく、いまさら、Developer やVB6 など、後ろ向きなことはやる気もしないので、そのままになってしまいました。でも、テキストって、本当に大事だなって思います。テキストの出来・不出来で、成敗が決まってきます。 >パスボックスが出てきてしまうので 後で試してみましたが、 Workbooks.Open FileName:=FILENAME,Password:="Chk", WriteResPassword:="Chk" と、WriteResPassword を入れなくてはならないことがありますね。

itashin
質問者

お礼

Wendy02さんこんばんは。 「補足」に書いたコードの続き(?)というか間の処理で、ユーザーフォームからB内のシートを呼び出す時のコードを載せます。 Private Sub CommandButton1_Click() Unload UserForm12 Worksheets("シート名").Visible = xlSheetVisible Sheets("シート名").Activate Application.WindowState = xlMaximized コマンドバー    ←コマンドバー定義のサブルーチンです Worksheets("シートメニュー").Visible = xlveryVisible End Sub コマンドバー定義のコードは長くてここには入りませんでした。 コマンドバー上に設定した「戻る」ボタンを押した時のコードを載せます。 Private Sub 戻る()  ←.OnActionのコード ActiveSheet.Protect , UserInterFaceOnly:=False CommandBars("コマンド").Delete With Application .WindowState = xlNormal .Left = -Application.Width End With Worksheets("シートメニュー").Visible = xlSheetVisible ActiveSheet.Visible = xlveryVisible Sheets("シートメニュー").Activate Application.DisplayFullScreen = False UserForm12.Show End Sub 前に頂いた書式変更は「戻る」と同じレベルに.OnActionで設定してあります。 この一連の処理はPass入力のboxを出さず、「B」を直接クリックして開こうとした時にLockをかけたいんです。それができれば、OpenイベントにWindows("B.xls").Visible = FalseやxlveryVisibleを仕込まなくてもいいと思うんです。

itashin
質問者

補足

Wendy02さん、立ち止まらず先に~のお言葉、大変心強いです。ありがとうございます。 Passの件ですが、Bの開閉の元のコード(pass未設定)を見ていただいてもいいですか? Sub Bを開く() Unload UserForm11  ←メインメニュー Workbooks.Open FILENAME:="c:\ABCを格納しているフォルダ\B.xls" Windows("B.xls").Visible = True MsgBox "Bメニューを開きます" UserForm12.Show   ←Bのシートを呼び出すためのメニュー End Sub Private Sub Workbook_Open() ←BのOpenイベント Dim myCB As CommandBar On Error Resume Next For Each myCB In Application.CommandBars myCB.Visible = False Next myCB On Error GoTo 0 With Application .WindowState = xlNormal .Left = -Application.Width .CommandBars("Worksheet Menu Bar").Enabled = False .DisplayFormulaBar = False .DisplayStatusBar = False End With Windows("B.xls").Visible = False End Sub Sub Bを閉じる() Unload UserForm12 Workbooks("B.xls").Close savechanges:=False   UserForm11.Show End Sub BはxlveryVisibleを使ってシートを全て非表示にして、Bookの保護をかけて(シート構成にチェックを入れました)格納しました。Pass解除はWorkbooks.open FILENAME,Password:="xxx"と記述しましたが、Open後にxlSheetVisibleを実行してシートを呼び出そうとする時にエラーが出ました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。Wendy02です。 >これは、AからBを、コードを使って開くことは出来るということですかね。 UserInterfaceOnly 自体は、シートプロテクトのVBA側の処理のひとつで、VBAの処理の時は、制限がなく使えるということで、他のブックを開くことには関係ありません。 >Bは単独でクリックして開こうとしてもロックして開けないようにできる!という事で宜しいですか? そういうものは、本来、アドインですね。 ブックのプロテクトして、VBAで開けるのは、Excel2000 を含めると、以下のようなコードになります。 'もちろん、パスワード、ファイル名を直接、メソッドのプロパティに入れてもよいです。 CONST FILENAME As String ="B" CONST PSW As String ="Chk" Workbooks.Open FILENAME, Password:=PSW このようにします。とりあえず、今日はここまでにします。抜けている部分もあるような気がしますので、もう一度、レスを読み直してみます。

itashin
質問者

お礼

Wendy02さんこんばんは。会社の2000でも問題なく動きました。 本当に助かりました。ありがとうございます。 VBAはまだまだ奥が深いとつくづく感じました。どうも私の悪い癖で、何でもカタチから入ってしまいます。開発当初からExcelベースなのにもかかわらず、なるべく作業する人にワークシートを見せたくない!なんて変なこだわりからユーザーフォームも最終的には18枚というとんでもない枚数になってしまいました。それに技術が伴っていないので多分コードもすごく効率が悪いのだと思います。これじゃハングしてもしょうがないですね。 教えて頂いたパスワードの件は、なぜかうまくいかず、パスボックスが出てきてしまうのでもっときちんと勉強しなきゃと思っています。やりたい事ばかりが先にたち、理屈を理解せずにここまで来てしまったので、これを機会に1から勉強し直してみたいと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

itashin さん、こんばんは。Wendy02です。 イメージとしては、だいたい分かります。私は、そこまでの経験はないのですが、自分の身に置き換えても、身が引き締まる感じです。それは、決して中途半端なレベルではありませんね。最初の設計を失敗すると、常に問題が発生してきます。見かけは簡単に思う人もいるかもしれませんが、VBAが1・2年のレベルの人ですと、最後に手がつけられなくなりそうです。(はっきりいって、私自身、そういう仕事を請けても、とても自信はありません。「たぶん出来るだろう」程度です。(^^;)完動するようになるまでは、1ヶ月は掛かりそうですね。 最初に気になったことですが、 >ユーザーフォーム入力中にかなりの確率でCPU使用率100%でフリーズしてしまい、 >Aは18枚のユーザーフォームと、1人あたり1042項目の入力事項 私の場合、VBAを覚えて3年目ぐらいまでは、ユーザーフォームを使っていたのですが、例のスタック形式とか、別のブック自体を、ユーザーフォーム代わりに、シートの大きさを小さくして使ってしまうようになりましたね。つまり、Wordと違って、Applicationのフレームが出てこないので、シートだけが出てくるわけです。そこに入れてしまう、という方法を取ってしまいます。そのほうが安定度がよいのです。どうも、ユーザーフォームのタイミングの悪さを感じます。 もちろん、ユーザーフォームに、スプレッドシートコントロールを、きれいにはめ込んで使ってもよいとは思います。試してみたら、Excel2003 用のスプレッドシートコントロールが、Excel 2000のユーザーフォームに張り付きました。ただし、これはOSが同じですし、私の場合は、Excel 2003と2000が共存した環境だからですが。 >手作業の書式設定だけ許可したい 私は、話を間違えて受け取っていましたね。「手作業」という部分を見逃していました。 でも、こんな風にして、[オリジナル・コマンドバー](ユーザーコマンドバー?)に加えてみたらいかがでしょうか? Excel 2000で実証済みです。 Sub SampleTest1() Dim rng As Range ActiveSheet.Protect , UserInterFaceOnly:=True '本来は、起動時に設定(以下参照)   With Application    On Error Resume Next    .DisplayAlerts = False    Set rng = .InputBox("範囲を設定してください", Type:=8)    .DisplayAlerts = True    On Error GoTo 0    If rng Is Nothing Then Exit Sub    rng.Select    ActiveSheet.Unprotect 'このときだけ外します。    .CommandBars.FindControl(, 855).Execute    ActiveSheet.Protect , UserInterFaceOnly:=True   End With End Sub 普通に使えるのに、プロテクトは掛かっています。 ただし、書式ダイアログが出ている時に、キーを特別なことをしたら、もしかしたら、アンロックの状態が現れるかもしれません。その場合は、例のInteractive が必要かもしれませんが、そこまで考えるのは、あまりにも、行きすぎかもしれませんが。 >ActiveSheet.Protect , UserInterfaceonly:=True という意味は、VBAは、何の制限もなく行えます、という意味なのですが、基本的には、ワークブックを開いたときに行うのが一般的です。つまり、一過性で、設定が残らない、ということです。 UserInterfaceOnly の使い方 'サンプル(Excel 2000用)-Password := "Chk" 'ThisWorkbook Private Sub Workbook_Open()   With Me.Worksheets("sheet1")    .Protect Password:="Chk", UserInterFaceOnly:=True   End With End Sub もしも、上記に入れるのでしたら、[オリジナルのコマンドバー(ユーザーコマンドバー?)] のタイミングは、どっちでも同じような気がしますが、どちらかというと、With Me~ の前でしょうね。 後、ひとつ気になるのは、Excel 2000用のバックアップシステムは作ってありますか? ハングするというお話ですので。 私の作ったものは、コードとしては、複雑ですが、理屈は、簡単です。  ・起動時に、バックアップを取るということです。 使っている最中に、Excel2000 のアドインは、あまりうまくいきません。もちろん、Excel2003 の既存の自動バックアップ機能も、タイミングがあまり良くありません。別のフォルダに置くようにしています。 最後に、私の書いたものは、大雑把で、実際の実務では、もう少し、細かな配慮をしなければいけないような気がします。たとえば、実務では、Activesheet ではなくて、Sheets("シート名")でもなく、シートのオブジェクトネーム(シートプロパテイに出てくる名前です)を使わなくてはなりません。

itashin
質問者

お礼

Wendy02さん、どうもありがとうございます。 SampleTest1()のコードを、早速コマンドバーの.OnAction="書式設定"とコード名を変更して組み込まさせていただきました。自宅のofficeXPでは問題無く作動しました!あとは明日会社のPCでテストさせて頂きます。 UserInterfaceOnly の説明についてですが、これは、AからBを、コードを使って開くことは出来るということですかね。逆に言えばBは単独でクリックして開こうとしてもロックして開けないようにできる!という事で宜しいですか?もしそうならばBのシートの保護は解除してもブックに保護をかけ、Aからしか開けないように出来ますね。早速試してみます。 ハング、バックアップの件ですが、ABと同様CもただのExcelBookです。Aからフォーム上のコマンドボタンでCを開き、AのデータベースをシートのコピーでCに追加していっているだけの単純なものです。リストアも同様です。問題はバックアップをする度にシートが追加されていくので、Cがあっという間に巨大になってしまう事です。それにユーザーフォームに入力中、いつフリーズするか分からないので、workbook.save用のコマンドボタンをあちこちに設置してこまめにAを保存する事しか思いつけませんでした。Aにはデータベースシート(1)、入力データシート(2)、リスト用シート(3)で、Cへは(1)の丸々コピーが追加されます。通常は(1)からHLOOKUPを使って抽出したデータを(2)に貼り付け、入力・変更を行い、入力メニューの終了と同時に(2)から(1)へ戻す(蓄積)+(3)の新リスト作成をします。今回このプログラムを作り始める時、本でOLEについての説明を読みましたがさっぱり意味が分りませんでした。結局、Excelの機能を単に自動化するだけのプログラムになってしまったので、コピー&ペーストが中心のみっともない仕上がりになってしまいました。 長文になってしまい、申し訳ありません。また結果をご報告させていただきます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。Wendy02です。 スタックというのは、重ねるとか、組み合わせる、という意味で、Aのブックを使用するときは、Bも立ち上げて使うということです。アドインと良く似ているのですが、通常、変数など、共有させるという、かなり特殊な使い方です。 この難しいのは、片方が親で、片方が子であるという位置づけが出来てしまいますので、子が勝手に終了することも出来ません。アドインの場合は、親の言うことを黙って聞いていますが、スタック形式ですと、通常は、親も子もなく、両方が使えるのですが、そのタイミングが図れなくて、ややこしくなることがあるのです。その点で難しいのです。 >ただの印刷するための書式集なので、Bのセルの数式バーにAのデータセルのリンクを貼ってあるだけで、印刷メニューを開いて初めてBを開き、印刷メニュー終了と共にBは閉じるようにしています。 それは、かなり、私の言う形式に近いですね。参照設定でつながっていなければ、そんなに問題はないのですが。 >Bのシートは基本的に全シート共にxlveryVisibleを使って隠し、 もう、そこまでしているなら、アドインを使っているのと同じことです。やってみれば、ファイルが、単に見えなくなっただけと、思うと思います。本格的に、アドインを作るなら、かなり難しいことをしなければなりませんが、その程度なら、問題ないと思います。 >本来はAccessを使った方がいいのでしょうが ある程度の技術があれば、AccessもExcelも関係はありません。たとえば、郵便番号データの12万行でも、Excelで問題なく検索できます。ただ、やはり、どちらかというとExcelの不安定さやスピードの遅さはあるような気がします。

itashin
質問者

お礼

Wendy02さん、昨日は夜遅くまで本当にありがとうございました。色々丁寧に教えて頂いて感謝しています。 実のところ私もExcelの不安定さはかなり感じています。ユーザーフォーム入力中にかなりの確率でCPU使用率100%でフリーズしてしまい、それを回避するためにとAutoupdateをキャンセルしたり、Application.Left = -Application.Widthでエクセルの画面を隠したりしてますが、あまり効果もないみたいです・・・。 そして、ActiveSheet.Protect , UserInterfaceonly:=True の使用方法を改めてお伺いしたいのですが、ここで作業の流れの概要をお話ししたいと思います。Bを開き、目的のシートを呼び出します。そこでオリジナルのコマンドバー(メニューに戻る、Excelに書き出し、プレビュー、印刷を配置)を起動しますが、今はそのコマンドバー起動の際に組み込みました。表示中のシートをプレビューを見ながらフォントサイズ・セルの塗りつぶしなどの最終仕上げを行い(セルの内容はAから引っ張ってきているので内容に変更は加えない)印刷または書き出し(表示シートのみ)を行い、メニューに戻るとsavechange = False でBを閉じます。 上記のフォントサイズ・塗りつぶしの所が今回の泣き所です。ActiveSheet.Protect , UserInterfaceonly:=True の使用タイミングは上記の通りで大丈夫でしょうか。他に書式設定を許可するための引数などはありますでしょうか? 正直、コード全部を見ていただきたいぐらいなのですが、Aは18枚のユーザーフォームと、1人あたり1042項目の入力事項(縦型のデータベースにしています)となっていて、1人も入力していなくてもすでに1メガ近いBookになっています。BはそのAとリンクさせているため、もし間違ってセルに貼ったリンクを書き換えて保存されてしまうと元も子も無くなってしまう訳です。手作業の書式設定だけ許可したいという本当にわがままな質問ですが、何卒宜しくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 >Application.Interactive = False 最初に、これは、目的が違いますので、使わなくてもよいです。これは、DDEや OLE オートメーションを使って他のアプリケーションなどのデータの入れだしの時に、割り込みを与えないようにするためのものです。 それと、Aの本体は分かるけれど、Bが良く分かりません。ブックを、スタック形式で使うというのは、もし、初心者だとおっしゃるならレベルが高すぎます。必要なら、隠しシートにしておいておくか、アドイン形式にすべきだと思います。 元の質問ですが、基本的には、 Sheets("○○").Protect , UserInterfaceonly:=True というように、UserInterfaceonly を使えばよいだけなのだと思います。

itashin
質問者

お礼

Wendy02さん、コード試させて頂きました。セルの選択は可能ですが、セルの色付けやフォントサイズ変更は出来ませんでした。最初が説明不足だったようです。すみませんでした・・・。 Bの印刷シートはAのユーザーフォーム上からコマンドボタンを使ってシートを呼び出します。呼び出したシートにはAの本体データベースに入力したデータを引っ張ってきていますが、文字数が多かったり、プレビューで見るとセルからはみ出してたりします。かと言って、セルの書式設定で文字サイズの自動調整をオンにしておくと、セルごとの文字数が極端に違うため、サイズがバラバラでとても見づらい表になってしまうのです。そこで、印刷する直前に仕上げの意味で、手作業でフォントをそろえたり、表を見やすくするためにセルに手作業(作業者の好み)で色をつけたいという事なのです。 ちなみに、入力するデータというのは殆どが文章なので、データの種別を条件にして自動で色を付ける事は難しいです。 あと、頂いたコードも、実は呼び出すシートが多いのでActivesheet.Protect,UserInterfaceonly:=True と変更してオリジナルコマンドバーの起動と同時に実行するようにして試しました。 とてもわがままな質問で大変恐縮ですが引き続き宜しくお願い致します。

itashin
質問者

補足

Wendy02さん、早速の回答ありがとうございます。Application.Interactive = Falseはすぐに消します。そして、Bについて補足ですが、スタック形式というのは申し訳ありませんがどういう形式か判りません。。。ただの印刷するための書式集なので、Bのセルの数式バーにAのデータセルのリンクを貼ってあるだけで、印刷メニューを開いて初めてBを開き、印刷メニュー終了と共にBは閉じるようにしています。 本来はAccessを使った方がいいのでしょうが、Excelのマクロの記録を切って貼って削ってのレベルなのでかなり回りくどい事をしているのは感じています。ちなみにBのシートは基本的に全シート共にxlveryVisibleを使って隠し、Aのユーザーフォームからコマンドボタンを押す事でxlsheetvisibleで表示させています。アドイン形式も使い方が良く分からないので勉強していきたいと思います。 頂いたコードはこれから試させていただきます。 ありがとうございます。

関連するQ&A