■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#23049-0ExcelとのOLEオートメーションyu2001-09-10(月) 09:14
     #23050-0RE#23049:ExcelとのOLEオートメーション2001-09-10(月) 09:53
     #23052-0RE#23050:ExcelとのOLEオートメーション匿名230522001-09-10(月) 10:11
     #23055-0RE#23052:ExcelとのOLEオートメーション2001-09-10(月) 11:15
     #23058-0RE#23055:ExcelとのOLEオートメーションyu2001-09-10(月) 11:45
     #23061-0RE#23058:ExcelとのOLEオートメーション2001-09-10(月) 13:20
     #23100-0RE#23061:ExcelとのOLEオートメーションyu2001-09-11(火) 16:10
     #23111-0RE#23100:ExcelとのOLEオートメーション藤代千尋2001-09-11(火) 21:56
     #23122-0RE#23111:ExcelとのOLEオートメーションyu2001-09-12(水) 17:04
     #23129-0RE#23122:ExcelとのOLEオートメーション藤代千尋2001-09-12(水) 21:43
#23049-0
ExcelとのOLEオートメーション
今現在、Excelのデータをデータベースとして、
VBのフォームで表示するプログラミングを書いています。
なんとか、Excelからでーたを引っ張ってくることができたのですが、
それには行番号を指定する必要があります。
今の状態では、もってきたいデータの行番号を調べ、
入力する必要があり、とても不便です。
私の希望としまして、Excelの一番左の列にある、
行番号をクリック(選択された行全体の色が反転する)
すると、VBで書いた実行ファイルが立ち上がり、
行番号を渡して、自動的にデータがVBのフォームに表示される、
ということがしたいです。このようなことってできるのでしょうか?
私自身いろいろ調べてみたのですが、それに関しての記述がなく、
困っています。どなたかわかる方、教えていただけないでしょうか?
よろしくおねがいします。
#23050-0
RE#23049:ExcelとのOLEオートメーション
> 私の希望としまして、Excelの一番左の列にある、
> 行番号をクリック(選択された行全体の色が反転する)
> すると、VBで書いた実行ファイルが立ち上がり、
> 行番号を渡して、自動的にデータがVBのフォームに表示される、
> ということがしたいです。このようなことってできるのでしょうか?

Excelマクロ+VBに引数を渡して起動。
という形になりますが、どうにか可能です。
ExcelシートのSelectionChangeイベントの引数Targetを調べてみてください。
さらにVB実行ファイル起動時の引数としてExcelファイル名を含めることにより、
処理が簡略化できるでしょう。

ただし、別個のアプリケーションを協調して動かすことになるため、制御には
細心の注意が必要になります。テストは十分に行ってください。
#23052-0
RE#23050:ExcelとのOLEオートメーション
> > 私の希望としまして、Excelの一番左の列にある、
> > 行番号をクリック(選択された行全体の色が反転する)
> > すると、VBで書いた実行ファイルが立ち上がり、
> > 行番号を渡して、自動的にデータがVBのフォームに表示される、
> > ということがしたいです。このようなことってできるのでしょうか?
> 
> Excelマクロ+VBに引数を渡して起動。
> という形になりますが、どうにか可能です。
> ExcelシートのSelectionChangeイベントの引数Targetを調べてみてください。
> さらにVB実行ファイル起動時の引数としてExcelファイル名を含めることにより、
> 処理が簡略化できるでしょう。
> 
> ただし、別個のアプリケーションを協調して動かすことになるため、制御には
> 細心の注意が必要になります。テストは十分に行ってください。

調べてみましたが、まったくわかりません。
マクロを使ったことがないので、どのように組み合わせて
使用してよいのかわかりません。

具体的に教えていただけないでしょうか?

よろしくお願いします。



#23055-0
RE#23052:ExcelとのOLEオートメーション
> > Excelマクロ+VBに引数を渡して起動。
> > という形になりますが、どうにか可能です。
> > ExcelシートのSelectionChangeイベントの引数Targetを調べてみてください。
> > さらにVB実行ファイル起動時の引数としてExcelファイル名を含めることにより、
> > 処理が簡略化できるでしょう。
> > 
> > ただし、別個のアプリケーションを協調して動かすことになるため、制御には
> > 細心の注意が必要になります。テストは十分に行ってください。
> 
> 調べてみましたが、まったくわかりません。
> マクロを使ったことがないので、どのように組み合わせて
> 使用してよいのかわかりません。

まずExcelからAlt+F11でエディタを開き、プロジェクトウィンドウのSheet1を
ダブルクリックしてから、開いたウインドウに以下のコードを貼り付けた上で、
Sheet1をあちこちクリックしてみてください。ご希望通り、ある1行を選択した
場合のみ、メッセージボックスが開くことが判るでしょう。
#各関数、およびRangeオブジェクトの説明は省略します。ご自分でヘルプを
#参照して調べる癖をつけてください。また、適宜処理を止めて、なぜこのよ
#うな処理をしているのかを理解するようにしてください。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim wRow1 As Long, wRow2 As Long
Dim celStr As String

If Target.Rows.Count > 1 Then Exit Sub
If InStr(Target.Address, ":") = 0 Then Exit Sub

celStr = Replace(Mid(Target.Address, 1, InStr(Target.Address, ":") - 1), "$", "")
If Not IsNumeric(celStr) Then Exit Sub
wRow1 = Val(celStr)
wRow2 = Val(Replace(Mid(Target.Address, InStrRev(Target.Address, ":") + 1, _
    Len(Target.Address)), "$", ""))
If wRow1 <> wRow2 Then Exit Sub

MsgBox "現在の選択行は" & CStr(wRow1) & "です"

End Sub

これで選択された行番号を抽出することができましたから、あとはVBに引数を
渡すことができれば、あとはVB側の処理となります。
Command$,GetObjectといった関数をヘルプで参照し、使い方を理解し、応用しましょう。

追記:
Replace,InStrRev関数はVB6もしくはOffice2000が入っていないと使えません。
もし対象システムがそのどちらもインストールされていないなら、同等の機能を持つ
関数を自作する必要があるでしょう。
#23058-0
RE#23055:ExcelとのOLEオートメーション
> > > Excelマクロ+VBに引数を渡して起動。
> > > という形になりますが、どうにか可能です。
> > > ExcelシートのSelectionChangeイベントの引数Targetを調べてみてください。
> > > さらにVB実行ファイル起動時の引数としてExcelファイル名を含めることにより、
> > > 処理が簡略化できるでしょう。
> > > 
> > > ただし、別個のアプリケーションを協調して動かすことになるため、制御には
> > > 細心の注意が必要になります。テストは十分に行ってください。
> > 
> > 調べてみましたが、まったくわかりません。
> > マクロを使ったことがないので、どのように組み合わせて
> > 使用してよいのかわかりません。
> 
> まずExcelからAlt+F11でエディタを開き、プロジェクトウィンドウのSheet1を
> ダブルクリックしてから、開いたウインドウに以下のコードを貼り付けた上で、
> Sheet1をあちこちクリックしてみてください。ご希望通り、ある1行を選択した
> 場合のみ、メッセージボックスが開くことが判るでしょう。
> #各関数、およびRangeオブジェクトの説明は省略します。ご自分でヘルプを
> #参照して調べる癖をつけてください。また、適宜処理を止めて、なぜこのよ
> #うな処理をしているのかを理解するようにしてください。
> 
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> Dim wRow1 As Long, wRow2 As Long
> Dim celStr As String
> 
> If Target.Rows.Count > 1 Then Exit Sub
> If InStr(Target.Address, ":") = 0 Then Exit Sub
> 
> celStr = Replace(Mid(Target.Address, 1, InStr(Target.Address, ":") - 1), "$", "")
> If Not IsNumeric(celStr) Then Exit Sub
> wRow1 = Val(celStr)
> wRow2 = Val(Replace(Mid(Target.Address, InStrRev(Target.Address, ":") + 1, _
>     Len(Target.Address)), "$", ""))
> If wRow1 <> wRow2 Then Exit Sub
> 
> MsgBox "現在の選択行は" & CStr(wRow1) & "です"
> 
> End Sub
> 
> これで選択された行番号を抽出することができましたから、あとはVBに引数を
> 渡すことができれば、あとはVB側の処理となります。
> Command$,GetObjectといった関数をヘルプで参照し、使い方を理解し、応用しましょう。
> 
> 追記:
> Replace,InStrRev関数はVB6もしくはOffice2000が入っていないと使えません。
> もし対象システムがそのどちらもインストールされていないなら、同等の機能を持つ
> 関数を自作する必要があるでしょう。

実行してみました。

私なりに考えて
Excelの行番号をmsgboxにて吐き出すコードの後ろに

Dim y As Object

Set y = GetObject("c:\winnt\profiles\user\デスクトップ\project\OLE.exe")

y.Visible = True
y.Form1.Text1.Text = CStr(wRow1)


というのを書いてみましたが、オブジェクトが見つからないという

エラーが返ってきました。

オブジェクトを生成して、引数を渡すということをしようと考えて
みましたが、なかなかうまくいきません。

何が悪かったのでしょうか?

教えてください、おねがいします。

#23061-0
RE#23058:ExcelとのOLEオートメーション
> 私なりに考えて
> Excelの行番号をmsgboxにて吐き出すコードの後ろに
> 
> Dim y As Object
> 
> Set y = GetObject("c:\winnt\profiles\user\デスクトップ\project\OLE.exe")
> 
> y.Visible = True
> y.Form1.Text1.Text = CStr(wRow1)
> 
> 
> というのを書いてみましたが、オブジェクトが見つからないという
> 
> エラーが返ってきました。
> 
> オブジェクトを生成して、引数を渡すということをしようと考えて
> みましたが、なかなかうまくいきません。

このコードだと、「VB実行ファイルをオブジェクトとしてExcel内で宣言し、使用する」
ことになりますね。
そうではなく、VB実行ファイル内でExcelオブジェクトを宣言し、使用するようにすれば
よいのです。そのためのヒントが"Excelファイル名を渡す"とかCommand$,GetObject関数
といったものです。
極端に言えば、先のコードのMsgBox関数の代わりにShell関数を用い、VB実行ファイル
を引数つきで起動するだけなんです。そしてVB実行ファイルが起動している間は、Excel
の制御はすべて実行ファイル側で行う形になります。
#23100-0
RE#23061:ExcelとのOLEオートメーション
> > 私なりに考えて
> > Excelの行番号をmsgboxにて吐き出すコードの後ろに
> > 
> > Dim y As Object
> > 
> > Set y = GetObject("c:\winnt\profiles\user\デスクトップ\project\OLE.exe")
> > 
> > y.Visible = True
> > y.Form1.Text1.Text = CStr(wRow1)
> > 
> > 
> > というのを書いてみましたが、オブジェクトが見つからないという
> > 
> > エラーが返ってきました。
> > 
> > オブジェクトを生成して、引数を渡すということをしようと考えて
> > みましたが、なかなかうまくいきません。
> 
> このコードだと、「VB実行ファイルをオブジェクトとしてExcel内で宣言し、使用する」
> ことになりますね。
> そうではなく、VB実行ファイル内でExcelオブジェクトを宣言し、使用するようにすれば
> よいのです。そのためのヒントが"Excelファイル名を渡す"とかCommand$,GetObject関数
> といったものです。
> 極端に言えば、先のコードのMsgBox関数の代わりにShell関数を用い、VB実行ファイル
> を引数つきで起動するだけなんです。そしてVB実行ファイルが起動している間は、Excel
> の制御はすべて実行ファイル側で行う形になります。

どうにかshell関数を使って、Excelフォームから、指定された実行ファイルを起動することが
できました。しかし、引数を渡すことができません。
引数つきで実行するってどういうことなんですか?
具体的に教えてください。

よろしくおねがいします。

#23111-0
RE#23100:ExcelとのOLEオートメーション
> どうにかshell関数を使って、Excelフォームから、指定された実行ファイルを起動することが
> できました。しかし、引数を渡すことができません。
> 引数つきで実行するってどういうことなんですか?

例えば、以下のように実行ファイル(VB で作成した EXE)を呼び出すと、
  Shell "xlEditor.exe /r:150"
実行ファイルの Command() 関数は "/r:150" を返します。

つまり、VB 側で、Command() 関数から、行位置を取得するようプログラム
することになります。(^_^)
#23122-0
RE#23111:ExcelとのOLEオートメーション
> > どうにかshell関数を使って、Excelフォームから、指定された実行ファイルを起動することが
> > できました。しかし、引数を渡すことができません。
> > 引数つきで実行するってどういうことなんですか?
> 
> 例えば、以下のように実行ファイル(VB で作成した EXE)を呼び出すと、
>   Shell "xlEditor.exe /r:150"
> 実行ファイルの Command() 関数は "/r:150" を返します。
> 
> つまり、VB 側で、Command() 関数から、行位置を取得するようプログラム
> することになります。(^_^)

r:150を返すとはどのようなことでしょうか?
rという変数に150という値が入り、VB側で呼び出せるのでしょうか?

やってみましたが、バリアント型で宣言しているにもかかわらず。

Excelの行番号をVB側で取得できません。

どのようにしたらよいのでしょうか?

教えてください。
#23129-0
RE#23122:ExcelとのOLEオートメーション
> > 例えば、以下のように実行ファイル(VB で作成した EXE)を呼び出すと、
> >   Shell "xlEditor.exe /r:150"
> > 実行ファイルの Command() 関数は "/r:150" を返します。
> 
> r:150を返すとはどのようなことでしょうか?
> rという変数に150という値が入り、VB側で呼び出せるのでしょうか?

Shell 関数で、実行ファイルを指定するとき、そのうしろに何かしらの文字を書くと、
それは引数として、実行ファイルに渡されます。

実行ファイルを VB で作るなら、この渡された引数を取得するための Command() 関数が
利用できるという事です。

引数はすべて文字列ですので、"/r:150" は "/r:150" という文字列です。
#なぜ "/r:" などが付いているかというと、それが目的の引数だと分かりやすくするためです。
 Commad() から取得した文字列から、"/r:" を見つければ、その後ろがまず間違いなく、行数
 指定だと分かるでしょう。
 
> やってみましたが、バリアント型で宣言しているにもかかわらず。
> Excelの行番号をVB側で取得できません。

#なにをバリアント型で宣言しているのか分かりません。(^^;)

とりあえず、VB でプロジェクトのプロパティを開き、「コマンドライン引数」という欄に"/r:150"
と書いてください。そして、プログラムの最初に実行される場所(Sub Main かフォームの Load 
イベント)に Msgbox Command() と書きましょう。そしてプログラムを実行すれば、"r:150" が
メッセージボックスに表示されます。

この「コマンドライン引数」という欄は、本来は、他のアプリケーションなどから渡される引数を
シミュレートするためのものです。ここに適当な文字列を書き、それをもとに動作するプログラム
を作れば、目的のプログラムとなります。あとは、プログラムをコンパイルして、実際に使って見て
問題がないか調べます。(^_^)
このページと関連する記事:
#18777-0現在のセルの位置を知りたい(Excel97 for VBA)2001-02-15(木) 10:13
#213-1dllから組み込みもとの属性を取得する方法2002-08-16(金) 11:10
#1277-0EXCELマクロの起動について2004-02-25(水) 11:23
#8189-0VBからExcelのシートやマクロを操作する方法2000-03-06(月) 13:21
#27320-0実行時エラー1004 cellsメソッドの失敗2002-03-05(火) 20:56
#125-3EXCELで帳票印刷2003-07-30(水) 14:03
#19765-0起動時の引数の受け取り方?2001-03-23(金) 16:29
#37531-0ExcelのSheetについて2001-01-23(火) 18:17
#5072-0VBからセル属性の変更とデータのソートをしたい2002-02-14(木) 12:56
#583-2Excel操作2003-12-24(水) 16:00
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)