[[20110107205319]] 『マクロのマクロによる制御』(ハリマオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロのマクロによる制御』(ハリマオ)

 まず質問いたします。マクロによるマクロの制御はできますか。
 マクロを登録したマクロ実行ボタンを通じてならできます。
もし可能ならば具体的な質問をさせていただきます。
(Excel2003 WindowsXP)

 どのような事かわかりませんが
 マクロでマクロのコードを書くとか言う事でしょうか?
 という事であれば、出来る出来ないで言うと出来ます。

 マクロセキュリティでVBEへのアクセスを許可して
 VBEを参照すれば出来たはずです。

 ただ、私はそのような事をしなくて良いようにシステム化というか
 仕組みを作るのが上手なプログラマーだと思いますので
 やりたくない内容に近いですけど。
 (momo)


 単にプロシージャの中で別のプロシージャを呼びたいということではないでしょうか?
 momoさんの書かれた内容でしたら、失礼しました。
 (Mook)

 できることを聞いて安心しました。
 具体的な質問に入ります。
     a          b          c       d      ・・・・
   番号    社名   品名
  1
  2
  ・
  ・

 のような台帳を作成し各番号セルに次のようなコードを作成しハイパーリンクを
使用した新しいブックを作成しその関連データを収納しています。

 Private Sub CommandButton1_Click()
  Dim セルアドレス As String, セルアドレス2 As String

  'ActiveCell.Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
        "\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & ".xls"
    ActiveSheet.Hyperlinks(ActiveSheet.Hyperlinks.Count).CreateNewDocument _
        Filename:="\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & ".xls", EditNow:=False, Overwrite _
        :=False

    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
    Windows("台帳.xls").Activate
    Sheets("トップページデザイン3").Copy Before:=Workbooks(TextBox1.Text & ".xls").Sheets(1)
    Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
    ActiveWindow.SelectedSheets.Delete
    Sheets("トップページデザイン3").Name = "トップページ"

    ActiveSheet.Shapes("Oval 1").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:= _
        "\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & "(データ).xls"
    ActiveSheet.Hyperlinks(ActiveSheet.Hyperlinks.Count).CreateNewDocument _
        Filename:="\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & "(データ).xls", EditNow _
        :=False, Overwrite:=False

    Workbooks(TextBox1.Text & ".xls").Activate
    ActiveSheet.Shapes("Oval 2").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:= _
        "\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & ".xls"
    ActiveSheet.Hyperlinks(ActiveSheet.Hyperlinks.Count).CreateNewDocument _
        Filename:="\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & "(金型).xls", EditNow _
        :=False, Overwrite:=False

    Workbooks(TextBox1.Text & ".xls").Activate
    ActiveSheet.Shapes("Oval 3").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:= _
        "\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & "(その他).xls"
    ActiveSheet.Hyperlinks(ActiveSheet.Hyperlinks.Count).CreateNewDocument _
        Filename:="\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & "(その他).xls", EditNow _
        :=False, Overwrite:=False
    Range("F11").Select

    ActiveSheet.Shapes("ボタン").Select
    Selection.OnAction = "台帳.xls!戻る"
    Range("F15").Select
    Range("d15").Value = TextBox1.Text
    Workbooks("台帳.xls").Worksheets("台帳").Activate                                '※1
    セルアドレス = ActiveCell.Offset(, 2).Address()
    セルアドレス2 = ActiveCell.Offset(, 3).Address()
    Workbooks(TextBox1.Text & ".xls").Worksheets("トップページ").Range("d16").Value = Range(セルアドレス).Text
    Workbooks(TextBox1.Text & ".xls").Worksheets("トップページ").Range("d17").Value = Range(セルアドレス2).Text
    Workbooks(TextBox1.Text & ".xls").Activate
    With ActiveWindow
        .DisplayHorizontalScrollBar = False
        .DisplayVerticalScrollBar = False
        .DisplayWorkbookTabs = False
        .DisplayHeadings = False
    End With
    Unload UserForm4

End Sub

 Selection.OnAction = "台帳.xls!戻る"で、作成したトップページより台帳に戻る
ように していますが、これは共有データですので、共有者1名しか使用できません。
それを使うためには、戻るためのボタンに使用者が登録しなおさないと
使用できません。するとまたたの使用者が使うときは登録のしなおしと
なります。それを防止のため、新たに作成したトップページに戻るための
マクロがブック作成時に登録できれば、そのような不便が解消できると思い
質問させていただきました。
トップページを作成後そのマクロを登録すればいいのですが。(ハリマオ)


 直接の回答ではありませんが、台帳とその他のファイルの関係、それを共有者間でどのように
 運用しているかをもう少し具体的に説明いただけませんか?
 工夫次第でそこまで複雑なことをしなくてもよいケースのように見受けられます。

 その他のファイルは、誰がどのようなタイミングで作成し、台帳との関連付けはどのように
 行っているのでしょうか。

 特に
 >それを使うためには、戻るためのボタンに使用者が登録しなおさないと
 >使用できません。
 の部分がどのような状況かよくわかりません。
 (Mook)

 状況説明が下手でわかりにくいことがあると思います。申し訳ありません。
 このようにわかりにくい部分は質問いただければ説明させていただきますので、
よろしく御願い致します。
 台帳は生産している製品の基本的なデータを書き込んでいます。書き込むデータは限りがあるので
台帳の番号セルに対応するハイパーリンクで関連付けたブック(トップページ)を作成し、
さらにトップページは目次的な役割を持たし、これに基本的な項目を3点作りそれからさらに
その項目のデータが細かく書き入れるブックを作成しそれぞれの項目のブックに
ハイパーリンクで関連付けています。先に示したマクロは新しい製品が台帳に登録されたとき
ハイパーリンクで関連つけたブックを作成するためのマクロです。このファイルの作成は
台帳に新たに登録されたとき、その製品の担当者が作成いたします。
 トップページから台帳に戻るためにマクロを台帳に作成し、トップページにフォームで
ボタンを作成しこれに戻るためのマクロを登録し戻っています。台帳は常時関連者(4名)が
常時開いています。トップページ以下は担当者が開くだけで、他の3名は閲覧する程度で、
常時開いているわけではありません。トップページに台帳に戻るマクロを作成し
戻るボタンにこれを登録すると、通常使用をする限り常時台帳に戻ることができます。
 そこで台帳に新たな製品を登録されたときトップページに台帳に戻るための、マクロを
作成できないだろうかという質問です。
 今は会社からで、すべての質問に答えられていません。続きは、自宅に帰ってから、
返事させていただきます。(ハリマオ)

 それを使うためには、戻るためのボタンに使用者が登録しなおさないと使用できません。 

 についてもう少し詳しく説明させていただきます。
共有者で使用しているうち1人はトップページに現在作成しているボタンを
使用することで、台帳に戻れますが、それ以外の人がトップページのボタンを
クリックしても、「登録されていないので実行できません」(現場ではないので
正確な表現では有りません。)と表示され台帳には戻れません。
そこでこのボタンに戻るためのマクロ名を登録すると
台帳に戻れるようになります。しかし、正常に作動していた人のPCで
台帳に戻れなくなります。そのため現状正常に作動する、先の方法でマクロを
記録したいのです。これは先に示したマクロコードの中で新しく作成した
ブックにマクロを記録することになると思い、マクロでマクロを
制御できるのでしょうかと質問させていただきました。ちなみに、マクロの記録
を使用して、このことを行ったところマクロの内容に対しては何の記録も
されませんでした。
(ハリマオ)

 もう一つ蛇足かも知れませんが、エラーのでる原因と思われることがあるので、追加して
記して見ます。それは、すべて共有データですが特に台帳は4名みんな、常時開いています。
そのため、台帳を最初に開いた人が優先権を持ち、後から開いた人は、台帳は
「読み取り専用」となります、ハイパーリンクでリンクするファイルはよほどのことがない限り
2名が開くことがないため、正常に作動しているのではないかと思われます。
このことはまだ実験を行ってないのであくまで想像ですが。ハイパーリンクのリンク先を
2名以上が開き、「読み取り専用」で開いた人は同様のことが発生するのではないかと
思われます。であれば、これの解決方法があれば最善ですが、ないとしても、ハイパーリンクで
2名以上リンクすることは非常にまれなことですので、先の相談です。(ハリマオ)

 台帳を直接複数の人が開いている事をやめて読み込みに行けばよいような?
 それかモードレスのフォームで対応出来そうかな?

 文章だけでの説明ですとハリマオさんが何をなさりたいのか私には良くわかっていません。
 コードもマクロ記録の状態に近いので(Activeが多い)対象のオブジェクトが不明確で
 実行結果がイメージしにくいです。

 台帳とトップページ?の関連やレイアウトなどがあると皆様から良い回答が得られると思います。
 とりあえず、「マクロでマクロの制御」は使わなくても対応出来そうな内容じゃないかな〜と思います。
 (momo)

 [台帳を直接複数の人が開いている事をやめて読み込みに行けばよいような?]
これは無理な相談です。

 私のやりたいことは、先に示したコードでトップページをハイパーリンクで作成していますが、
そのトップページに、台帳に戻るコード

 activeworkbook.close
 workbook("台帳").activait 

 を組み込みたいのです。(スペル間違っているかもしれません)
 そうすれば、トップページにボタンを作成しそれにこのコードを登録すれば(これは現在の
マクロでも設定できています
ActiveSheet.Shapes("ボタン").Select
    Selection.OnAction = "台帳.xls!戻る"
がこれに対応するコードと理解しています)、先に示した
コードに組み込まれているので、新たにコードを作成しなくても、台帳に新たなデータが
追加されたとき、このハイパーリンク設定することにより、トップページより台帳に
戻るコードが自動的に作成できるのではないかという、少々虫のいい要望なのです。
 それともう一つ、ハイパーリンクの新たな設定の方法は、ユーザーフォームを
作成しその中にテキストボックスを設定しテキストボックスには、トップページのブック名を
書き入れるように設定し(はじめに記した台帳フォームセルAの番号たとえば1)コマンドボタンで
最初に記したコードで実行するようにしています。
(ハリマオ)


 あまり物事を決め付けて考えると、自由度が損なわれるかと思います。
 > [台帳を直接複数の人が開いている事をやめて読み込みに行けばよいような?]
 >これは無理な相談です。
 というのは何故でしょうか。

 「できない」と一刀両断せずに、可能性を考えてみることはできませんか。
 単に各ファイルへのジャンプをするだけのインデックス的なものであれば、必ず
 しもマスタを開いていなくとも、最初にマスタから複製して個別のファイルと
 してしようし、各ファイルからはボタンではなくマクロのショートカットキーで、
 戻る処理にしておけば、新規に作成したファイルにマクロ自体をおく必要が
 なくなります。

 共有ファイルでのハイパーリンクはいろいろと制約もありますので、最後に
 書かれているように、ブックとシートを直接指定する処理で代用可能であれば、
 その方が良い気がします。

 これの可否は、台帳ファイルをどのように使用しているかによると思いますが、
 各ファイルへのインデックスとして以外に使用しているのでしょうか。

 以下蛇足ですので、興味が無ければ読み飛ばしてください。
 複数の作業者で共通データを使用する場合、一応 EXCEL 共有ファイルの機能は
 ありますが、いろいろと問題も多いです。ですから基本的には共有の運用自体
 避けた方が良いことが多いです。
 特にデータとしての重要度が高い場合には Access や Database が使用できるの
 であれば、そちらへ移行した方が良いでしょう。
 そこへのデータの入出力としての I/Fや、集計用として EXCEL を使用すること
 も可能です(もはや質問の範疇を超えて、余計なお世話ですね。)

 購入できるのであれば、FileMaker なんてこのような用途にうってつけのソフト
 なのですけれどね。
 (Mook)

 Mookさん有難うございます。
 やはりそちらのほうに進みましたか。私が行っていることは確かにAccessを使用したほうが
スムーズにできることは、薄々感じていました。データの保存を、できる限りペーパーレスで
実行したいと考え、それが丁度私がマクロを勉強し始めたときと合致したのでExcelで
このシステムを立ち上げました。このシステムを立ち上げて、もう3年になり、データが
非常に大きくなっています。ちなみに台帳のデータは6000件、台帳からリンクできる
ファイル数が台帳データの5000件以降からはじめていますが3000件近く
になっています。また台帳自体にもマクロを組み込み、期間を指定すればその期間に発生
した件数、金額等集計できるようにしているので、台帳を閲覧できる人は、重宝に
使用されているようです。また問題発生時にはそれぞれのデータに入り込んで、問題解決
に使用されていることもあるようです。

 ただ私はAccessに対してはずぶの素人です。少し勉強したいと思いますが、一つ質問
させてください。現行のシステムをAccessで立ち上げたとして、保存しているExcelデータを
Accessで立ち上げたシステムに移行することは可能でしょうか?それとも1からの立ち上げに
なるのでしょうか?(ハリマオ)

 実際の内容を見れませんので、無責任な発言になることはご容赦ください。

 通常 EXCEL から Access へのデータのやり取りはあまり問題ないでしょう。
 ただ、データの入れ先(データベースとテーブルの構成)は作成することになり
 ます。現在の EXCEL のデータが表形式で、各ファイルの構成が同一であれば、
 構成要素はそのままでも可能だと思います。シートやファイルに相当する情報を
 どうするかは検討が必要でしょう。
 実際の中身が分かりませんし、やらないとは思いますが、現在のファイルごとに
 テーブルを作るというやり方はしない方が良いでしょう。

 ただ経験がないとのことですので、現在ご質問の内容を短期的な対策として検討
 し、Access への移行を中長期的な対策として検討するのが良いのではないでしょうか。

 蛇足が多いですが、
 現在の EXCEL ファイルもですが、破損や誤操作からデータを守るために
 ファイルのバックアップも大事ですね。
 (Mook) 

 Mookさんたびたびのご指導有難うございます。

 私の質問の仕方がいたらず、また説明も片手落ちのため私の希望している解決方法は
見つかりませんでしたが、台帳ファイルからリンクする新たに作成されたファイル
(トップページ)に台帳ファイルに戻るマクロを記述しトップページに作成した
ボタンにこのマクロを登録すれば、私の希望している作動は正常に行っています。
現状は台帳ファイルにこのマクロを記述しトップページに作成した戻るためのボタンに
登録していました。マクロの記述ファイルと登録ボタンのファイルが違うため、
通常ならばこれでも問題なく作動しますが、何か邪魔な要素(今回の場合は
台帳ファイルを共有している)が加わったため正常に作動しなくなったのではないかと
思っています。Excelはほぼ完璧なのでこれも何らかの解決方法はあると思います。

 こういう解釈の元に台帳からリンクするトップページを作成するマクロの中に
トップページファイルに台帳に戻るマクロを書き込むように組み込めないかなという希望でした。
Mookさんはこのように記しても、当事者でないので私のシステムがイメージできないのだと思います。
今後は、台帳に新たなデータが記入されたときは、作成したトップページに台帳に戻るためのマクロを
書き込むようにいたします。コピーをとって貼り付けそれをボタンに登録するだけのことですから。

 それとデータを守るため、私の場合、台帳ファイル及びそれからリンクするファイルを一つの
フォルダにまとめていますので、このフォルダのバックアップをこまめに取るようにしています。
重要なデータとなりましたので、破損は命取りです。

 最後になりましたが、もし今までのやり取りにおいて、私の希望する作動のマクロの作成方法に関して
何か気づいた点があれば何でも教えてください。(ハリマオ)


 希望される回答にならずにすみません。

 作成するファイルに毎回同じマクロを張るのであれば、あらかじめマクロを置いた
 テンプレート(xlt ファイル)として、それを利用することはできないでしょうか。
 トップページファイルというのが、どのようなものかよくイメージできていません
 ので、これが可能かどうか判断が付きませんが、戻るための位置をシート上のデータ
 から判断できれば、マクロにはまったく手を入れずに済むと思います。

 また代替案として、Personal.xls に特定のファイル(台帳?)を表示する処理
 を書いておくだけでも、各ファイルにマクロを置かなくてもすまないでしょうか。
 ボタンではなく、ショートカットやメニューバーにボタンを置くことで、簡易
 的に起動できると思います。以下メニューバーを追加する説明サイトです。
http://www.officetanaka.net/excel/vba/tips/tips54.htm

 簡単でよいので、各ファイルの構成内容の説明と、相互の関係が文章だけでなく
 具体例で説明があると、もう少し理解しやすい気もします。
 (Mook)

 もう一度挑戦してみます。

   a          b          c       d      ・・・・
   番号    社名   品名
  1
  2
  3
  4 ←このセルにハイパーリンクを設定しトップページファイルにリンクするようにする

 そのためのマクロが、(ユーザーフォームを作成しそれにテキストボックスと
コマンドボタンを配置しています。)

 Private Sub CommandButton1_Click()
  (Dim セルアドレス As String, セルアドレス2 As String)←今回の質問には関係ないと思われるのでこれは無視してください。

  'ActiveCell.Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
        "\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & ".xls"
    ActiveSheet.Hyperlinks(ActiveSheet.Hyperlinks.Count).CreateNewDocument _
        Filename:="\\Pc2201116\新しいフォルダ (2)\台帳\ハイパーリンク\" & TextBox1.Text & ".xls", EditNow:=False, Overwrite _
        :=False
 Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
    Windows("台帳.xls").Activate
    Sheets("トップページデザイン3").Copy Before:=Workbooks(TextBox1.Text & ".xls").Sheets(1)
    Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select←これも今回の件に関係ないと思います
    ActiveWindow.SelectedSheets.Delete←これも今回の件に関係ないと思います
    Sheets("トップページデザイン3").Name = "トップページ"

 ActiveSheet.Shapes("ボタン").Select
    Selection.OnAction = "台帳.xls!戻る"

 です。
 TextBox1.Text  に A列の新規に作成されたデータ(上図で4が新規に作成されたのならば)
4を入れ実行する。

 そうするとハイパーリンクフォルダに 4.xls という名前のファイルが作成されます。

 これに台帳内のトップページ用にデザインされたシートをコピーします。このシートには
「表示」-「ツールバー」-「フォーム」で作成したボタンがセットされています。
このボタンにマクロ"台帳.xls!戻る"を登録しています。
 "台帳.xls!戻る"の変わりに ファイル"4.xls"に

 Sub 戻る()
 ActiveWorkbook.Close
 Workbooks("台帳").Activate
End Sub

  を書き込むマクロを、上記マクロの中に組込み、ボタンにこれを登録したいのです。
これができるだろうか?と言う質問です。解っていただけたでしょうか。(ハリマオ)

 


 たびたび出てくる言葉で「トップページ」というのはある種のファイルだと
 思うのですが、まだ全体の状況が不明です。

 問題の解決を進める前に私の見解ですが、マクロによるマクロの変更は以前
 (EXCEL 2000以前?の頃)は確かにできた記憶がありますが、セキュリティの
 観点から、現在ではできないようになっている認識です。

 momoさんの書かれた内容は、知りませんのでそれを使用した方法は回答
 出来ません。私の回答方針は動的にマクロを変更せずに、データを使用して
 マクロの動作を目的通りにすることです。
 このためにはハイパーリンクの運用自体変更しなければならないかもしれません。

 もし変更をしたくなく、現在の質問内容に対する解を得たいようでしたら、
 他の識者の回答をお待ちください。

 上記の条件の上で解決を進めたいようでしたら、台帳、トップページ、
 その他のファイル(?)の関係をいま少し説明いただけますか。
 詳細な不明点に関する確認は、ハリマオさんの回答方針の判断を伺った後いたします。

 追記:
 >このボタンにマクロ"台帳.xls!戻る"を登録しています。
 はどのようにして存在しているのでしょうか。
 トップページ(ファイル)はどのように作成しているかを説明いただいたほうが
 よさそうにも思えます。
 (Mook)

 トップページはファイルです。先に示したコードで作成したハイパーリンクでリンクする
ファイルです。momoさんは私のやろうとしていることは邪道とおっしゃっているようですが
Mookさんはそれをできると考え私の質問に答えてくださっているので、できるならそれをしたい
と考え真剣に討論させていただいています。

 ハイパーリンクの運用自体の変更もあえて辞しません。解決方法があるのならば。
ただあくまでマクロで解決したいと思っています。(ハリマオ)

 それでは一旦、何をどうしたいかということを忘れて、単純に現状をご説明ください。

 Q1 トップページと呼んでいるファイルはいくつありますか?
 Q2 トップページと呼んでいる実際のファイル名は何ですか?
   また、その情報は台帳にありますか?
 Q3 台帳.xls の A列 にある数字は何を示し、それをクリックすると何が起こりますか。
    ハイパーリンクがあったとして、どのファイルのどこのセルが開くのでしょうか?
 Q4 トップページファイルが複数ある場合、(シート数、シート名、セル配置)はどのようになっていますか?
   そしてそれらは同じ構成ですか?
 Q5 トップページからさらに別のファイルへのハイパーリンクが存在しますか?
 Q6 トップページを新規に追加する際には、どのような手順で行っていますか?
 Q7 トップページ上のボタンに登録されているマクロ名は何ですか?
 Q8 トップページにテンプレートファイルを利用できない理由が何かありますか?
 Q9 トップページ上のボタンを押した場合、台帳.xls のどこに戻りたいのですか?
 Q10 台帳の用途はトップページを開くこと以外に何かありますか?
 Q11 Personal.xls をご存知ですか?
 Q12 トップページとその下層のファイルがあるかと思いますが、そこは気にしなくて
   よいですか?

 とりあえず、上記に回答いただけますか。
 (Mook)

 お答えいたします。

 A1 基本的にはA列に登録されている数値にすべて設定しています。
 A2 A列の番号.xlsです。
 A3 その行の管理NO.です。A列の管理NO,をクリックすることにより対応のファイルが開きます。たとえば
  クリックした管理NO.が2であれば、2.xlsファイルが開きます。
 A4 シートは1枚だけです。セル配置は変更しておりませんデザインは使いやすくするため変更していますが
  基本的には同じ構成と考えてください。
 A5 存在します。
 A6 ユーザーフォームを使用した先のマクロを使用して作成しています。
 A7 「戻る」です
 A8 特にありません。たまたま 台帳.xls上シートにサンプルシートを作成したのでそれをコピーして使用していま   す。
 A9 基本情報の有るシート(上記サンプルと同様情報のあるシート)
 A10 基本情報の閲覧、検索、及びその情報のまとめに使用しています。
 A11 解っていません
 A12 気にしなくていいと思います。台帳とトップページの関係と同様ですので、これが解れば、
  右に倣えできると思います。

 もう一つトップページについて説明を加えておきます。

 現実にあるファイルを思い浮かべてください。私がトップページと呼んでいるものは、それの
表紙と目次に当たるものです。だからそこに表示されているものは、管理NO.、商品名
それと、目次に当たる3項目 
 1、品質データ 2、それを生産する機械のデータ 3、それの生産スケジュールに関するデータ
それぞれにそれぞれのファイルにハイパーリンクするため図形(楕円)を作成しこれをクリックすれば対応
データが開くようにしています。このように1クッション置かずに直接台帳にハイパーリンクを
設定すればいいのですが、与えられたスペースは1行なのでデータが増え追加でファイルを作成した
ときなど 不便なことがあるのでこのようにしています。またトップページ以降の扱いは
その商品の担当者、または担当グループに任されています。これ以降は少々蛇足になりますが
私の場合、データファイルを閉じたときは、必ずトップページに戻るようマクロを組んでいます。
そうすればトップページの閉じ忘れなく今相談しているトップページのボタンで
台帳に戻れるからです。(ハリマオ) 

 だいぶ状況が分かっていました。
 トップページ以下に関して、一応考慮した方がよさそうなので、追加で質問させてください。

 Q13 トップページの下位にあたるファイルは、どのようなファイル名ですか。
 Q14 トップページ上のリンク名は何になっていますか
   例えば、123.xls のファイルの場合はどうなっていますか。
 Q15 すべてのファイル(台帳、トップページ、その下位ファイル)は同一フォルダにありますか?
   あるいは、なんらかの階層構造になっていますか?
 (Mook)

 お答えいたします。

 A13 目次3項目に対応するファイル名を私のマクロ内で使用している物で示します。
     品質対応  管理NO(データ).xls  例 123(データ).xls
     機会対応  管理NO(金型).xls  例 123(金型).xls
     納期対応  管理NO(その他).xls 例 123(その他).xls
 A14 チョット質問の意味が理解できません。
 A16 台帳という名前のフォルダに台帳.xlsを収納、トプペーシ及びその下位ファイルは「ハイパーリンク」と
  言う名称のフォルダにすべて収納しそのフォルダは台帳フォルダの中に収納しています。
  台帳.xlsファイルの他のシートにもハイパーリンク設定ファイルがあるのでそれはそのシート専用のフォルダ
  を作成し台帳フォルダに収納しています。台帳フォルダには、ハイパーリンクフォルダを含め
  4個のフォルダが収納されています。

 以上です。これらのことは、最初に表示した私の使用しているマクロの中で表現されていると思います。
階層構造ということで有れば、マクロ内で表示されているのが正確な表示と思われます。
ただ今お話している内容にプラスした作業も行っているので、混乱があるかもしれませんが。
(ハリマオ)

 横からすみません。

 ざっと拝見すると、要はハイパーリンクで階層構造のファイルを順に開いている。
 その「戻る」方法を模索しているということでしょうか。

 だったら「Web」ツールバーの「戻る」ボタンを利用したらそれで済んでしまう
 ような気がするのですが、そんな単純なことではないのですかね?
 (とおりすがり)


 とおりすがりさん、すみません。

 私の知りたいことは「戻る」を検索をしているのでは有りません。このことを通じて、
最終的に表題にも書いている、マクロでマクロを制御できるかどうかを勉強しています。
戻る行為は中に示しているようにする方法はあります。マクロでもそのこと自体できています。
ただちょっとしたトラブルの発生をきっかけに、マクロ作成の中で希望のマクロを備えたファイルを
作成できないかということを、勉強させていただいています。
遠回りしているようですが、勉強です。(ハリマオ)

 >マクロ作成の中で希望のマクロを備えたファイルを作成できないか
 あららら〜、焦点はそこだったのですか?

 これまでも述べたように、私が目指しているのは問題の解決で、マクロによるマクロの変更
 ではありません。
 momoさんが言っていてたのは、下記の情報だと思いますが、
http://officetanaka.net/excel/vba/vbe/01.htm

 EXCEL 2003以降では技術的な可否が不明ですし、特に 2007以降セキュリティが厳しくなって
 います。上記の情報は私の使用している 2010では(おそらく2007でも)設定項目自体が同じ
 ものは存在しません。

 もし、マクロの変更に固執されているのでしたら、上記の情報をもとに自身でトライいただく
 か、他の回答者の回答をお待ちください。

 せっかくここまでのやり取りしたので、現時点での私の解決案は下記の通りですが、目指す
 ところが異なるようでしたら、廃案としてください。

 (1)Personal.xls に下記のメニューボタンを置き(あるいはショートカット か キー定義)
    ・台帳を表示する
    ・開いている台帳以外のファイルをすべて閉じる
    等の機能を登録する。
 (2)台帳の Worksheet_BeforeDoubleClick で A列の番号のファイルを開く
    ・ハイパーリンクはすべて削除
    ・ついでにその番号のデータ、金型、その他のファイルを開くポップアップを追加し、
     直接のファイルアクセス機能を追加
 (3)トップページはテンプレート化し、台帳を開く処理を事前登録(なくても可)
 (Mook)

 Mookさんごめんなさい。

 私は、できると解釈しました。最終的には、それにたどり着けるものと思い、
続けてきました。結局マクロにに於いては、momoさんがおっしゃっているように
できるけれど邪道ということですね。(ハリマオ)

 >最終的に表題にも書いている、マクロでマクロを制御できるかどうか

 今回の問題がこれで解決できるか否かは別として、
 既に記述されているとおり、Vbprojectを操作することで「マクロでマクロを制御」は可能です。

 が、・・・・。
 他の投稿者さんもこの仕様でVbProjectを操作するコードを採用することに消極的であるのと
 同様に提示された仕様では、「マクロでマクロを制御」するようなコードを記述するべきではない
 という立場からの意見です。

 Vbprojectの操作は、Excel2000までは、VBAが稼動する環境なら、
 何の設定もなく可能になっていました。

 私もVbprojectの操作を知ったのはこの頃でした。
 Excel2000全盛の時代でも、このVbprojectを操作するコードを
 「ウイルスまがいだ」とか「本当のコンパイラ言語では、こんなことできない(しない)」
 等の理由から、掲示板では投稿すべきではない という意見もありました。

 当時の私は、これらの意見に対し、頷ける点はあると感じつつも・・・、
 「ウイルスまがいだ」には、「ウイルスも使いようでワクチンになる」とか、
 「本当のコンパイラ言語では、こんなことできない(しない)」では、コンパイラ言語だって、
 メモリ管理を熟知していれば、可能だ(オフコンでですが、実際にやったこともあります)
 等と思い、それで良いシステムが作成できるなら、よいではないか!!
 と思っていました。

 Excel2002からは設定が必要になり、実質セキュリティレベルを下げないと、Vbprojectの操作が
 出来なくなりました。

http://support.microsoft.com/kb/813969/ja

 Excel2010では、確認していませんが、角田さんのサイトの

http://homepage2.nifty.com/kmado/ksoft10.htm

 VBA開発者向けのツール(例 VBAマクロをリフレッシュしファイルサイズ肥大や不都合を解消します。)ですが、
 VbProjectを操作しているといわれています。
 これがExcel2010まで可能であるとなると、Excel2010も同様の方法でセキュリティレベルを下げて、
 Vbprojectの操作は可能だと思います。

 こうなってくると、私のVbProjectの操作に関する考え方は、少し変わってきました。

 Vbprojectの操作は、セキュリティレベルを下げないと使用できない、

 Vbprojectの操作が、その仕様が、セキュリティレベルを下げてまで必要なのか?

 という問いかけに 少なくともプログラマであれば、他人が納得できる説明は必要であろう
 ということです。

 例えば、その仕様の有用性、Vbprojectを操作すること以外に実現不可能だということの説明、
 そのプログラムの使用者は、セキュリティレベルを下げることの危険性をわかっているか?
 等等。
 他にも規制が必要かもしれません。

 今回の場合、他の代替案があるのなら(本題は私は検証していませんが)、
 その方法を検討したほうがよいでしょうね!!

 >遠回りしているようですが、勉強です。
 というのなら、一つ例題コードです。

 Excel起動してください。
  [ツール] メニューの [マクロ] をポイントし、[セキュリティ] をクリックします。
  [セキュリティ] ダイアログ ボックスで [信頼できる発行元] タブをクリックします。
  [Visual Basic プロジェクトへのアクセスを信頼する] チェック ボックスをオンにします。
  [OK] をクリックします。

 これは、Excel2003の場合ですが、これで VbProjectの操作が可能になります。
 新規ブックにて、標準モジュールに

 ‘===================================================================
 Sub 私の名前はichinoseですというマクロを作成()
    Dim cdarray As Variant
    Dim g0 As Long
    cdarray = Array("sub マクロ()", "   msgbox ""私の名前はichinoseです", "end sub")
    With Workbooks.Add.VBProject
       With .VBComponents.Add(1).CodeModule
          .DeleteLines 1, .CountOfLines
          For g0 = LBound(cdarray) To UBound(cdarray)
             .InsertLines g0 + 1, cdarray(g0)
          Next
       End With
    End With
 End Sub

 私の名前はichinoseですというマクロを作成 を実行してみてください。
 新規ブックが作成され、そのブックの標準モジュールに

 Sub マクロ()
   MsgBox "私の名前はichinoseです"
 End Sub

 というコードが作成されているはずです。

 マクロでマクロを制御 とは、こういうことなんでしょう!!

 後は、Vbprojectを良く調べてください。その後の問題は、これを使って何を作るか? です。
 よくよく 検討してください。

 尚、Vbprojectのテストが終わったら、

[Visual Basic プロジェクトへのアクセスを信頼する]のチェックは、再びはずしてください

 ichinose


 返信が遅くなりました。
 Visual Basic プロジェクトへのアクセスは2007でも可能でした。

 なので、やろうと思えば可能です。(2010はわかりません)
 邪道とは言いませんが、他の方法で構築すべきだと思うので
 2番目の質問に対しての直接的な回答は控えさせていただきます。
 ichinoseさんのコードが理解できれば多少の応用で出来るのではないかと。

 (momo)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.