ab.com コミュニティ

ActiveBasicを通したコミュニケーション
前回の訪問日時: 2019年12月12日(木) 23:26 現在時刻 - 2019年12月12日(木) 23:26

All times are UTC+09:00




 [ 12 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年2月22日(水) 20:52 
エクセルを起動する場合、エクセルのセキュリティを「中」にして
マクロを起動すると、マクロを有効にするか否かのメッセージが表示されます。
これをスキップするには、他のアプリケーションからエクセルを
起動するようにすればよいとの事ですが
ActiveBasicからエクセルを起動すれば「例の表示」されないと思い

ShellExecute(NULL, "open", "C:\Test.xls","", NULL, SW_HIDE)
としました。

ところがダメでした。(表示が出る)

どうすれば良いのでしょうか。
どなたか教えてくださいませんか。

(自分は多少VBAが解る程度です)

よろしくお願いいたします。


ページトップ
   
 
投稿記事Posted: 2006年2月23日(木) 20:28 
どうやら説明不十分だと感じましたので再度お願いします。
------------------
set xlObj = CreateObject("Excel.Application")
with xlObj
.Workbooks.Open("C:\Test.xls")
.Run("Test.xls!Auto_open")
end with
------------------
このテキストを拡張子VBSで保存してから実行すると
マクロを含むTest.xlsは「セキュリティ警告」を表示しないで
いきなりエクセルのマクロを実行します。
(定石文だそうです。)

エクセルを正面から実行するとマクロを含む時
必ず「セキュリティ警告」は表示されるが
エクセル以外のプログラムからそのエクセルを呼び出せば
「セキュリティ警告」は表示されません。
との御宣託を諸先輩から受けました。

ところが、Test.Vbsはテキスト文なので簡単に変更されてしまいます。
ActiveBasicのExeから呼び出せば同じ事が出来て
簡単に変更されない。と思い付いたのです。

ABから呼び出してもダメなのでしょうか。
多分呼び出し方が間違っているのだろうと思いますので
どなたか、是非教えて下さいませんか!


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月24日(金) 07:48 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
結論だけ言えば「不可能ではない」です。
できるのですが,VBScriptほど簡単にはできません。

> .Run("Test.xls!Auto_open")
この!Auto_openがみそだと思い,まずこれを試してみました。
ShellExecute(NULL, NULL, "excel", "~~.xls!Auto_open", NULL, SW_HIDE)
しかし駄目でした。というわけで真面目に取り組む必要がありそうです。

Excelなんかはオートメーションと言う技術を使っていて,
これは様々なプログラミング言語から使えるということになっています。
(ただ使用する言語によって向き不向きがあります。ようするに楽だったり面倒だったりします)
DeadDoorさんのVBScriptもオートメーションに対応しているからExcelを操作できたのです。

現在のAB4は残念ながら面倒なほうに該当しますが,できないわけではありません。
VBSと同じようにCreateObjectやExcel.ApplicationのWorkbooks.OpenとRunを呼んでやればよいのです。

しかし試してみたのですが,どうもうまくいっていません。
サンプルはもう少し待ってください。


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月24日(金) 18:35 
オフライン

登録日時: 2005年5月31日(火) 10:52
記事: 264
お住まい: 高知
よこやりですみませんが、
ふと思いついたことがあるので書き込みます。

ABでVBScriptファイルを出力して実行までを行うバッチプログラムを作ればよいのではないでしょうか?

VBScriptの実行が終了した時点でスクリプトファイルを破棄すれば簡単ではないかと思います。

ファイルの作成もtempフォルダにしておけば気付かれにくそうですし。。。

コード:
#console

' ↓ ここからプログラムが実行されます

Dim buf[MAX_PATH] As Byte
GetTempPath(MAX_PATH,buf)

Dim temp As String
temp=MakeStr(buf)

Open temp+"temp_vbscript.vbs" For Output As #1

Print #1,Ex"set xlObj = CreateObject(\qExcel.Application\q)"
Print #1,Ex"with xlObj"
Print #1,Ex".Workbooks.Open(\qC:\\Test.xls\q)"
Print #1,Ex".Run(\qTest.xls!Auto_open\q)"
Print #1,Ex"end with"

Close #1
Exec temp+"temp_vbscript.vbs"

Print "Excel起動中"
Sleep(500)

Kill temp+"temp_vbscript.vbs"


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月24日(金) 23:46 
私も便乗させて頂いても良いでしょうか?

イグトランスさま>
前にお伺いしたこともありますが、
オートメーション技術(ActiveX・COM)の
アプリケーション開発の分野に非常に
興味を持っています。現在は有効な手段が
見つからないので、VB6.0にて開発していますが、
文字列結合などVB・VBSでは非力な面があって、
どうしてもABでこの分野の開発がしたいのです。

>現在のAB4は残念ながら面倒なほうに該当しますが,できないわけではありません。
>VBSと同じようにCreateObjectやExcel.ApplicationのWorkbooks.OpenとRunを呼んでやればよいのです。
この手法が、どうもサンプルがなくて難しいのです。
面倒なコーディングを強いられるのは、ちょっと苦手
なんですが、ABには期待していますので、サンプルの
お願いをさせてください。
私は主にWord・Excel・Adobe系ソフトのActiveX系ソフトを
作っています。
よろしくお願いいたします。

DeadDoorさま>
>ところが、Test.Vbsはテキスト文なので簡単に変更されてしまいます。
>ActiveBasicのExeから呼び出せば同じ事が出来て
>簡単に変更されない。と思い付いたのです。
私も常々、同じ事を思っています。

山本さま>
ぜひABでも容易にオートメーションできませんか?


ページトップ
   
 
投稿記事Posted: 2006年2月25日(土) 13:07 
NoWest様、こんにちは。
まだ、ABでの経験は数時間な未熟者に懇切丁寧なコードを
開示していただき感激しております。

VBAしか知らない自分ですが、コードの流れと意味は理解できます。
ただ「+」「¥q」「¥¥」などの記号の意味が解りませんが
           (Helpで捜せない!!!)
こうやって書くのだと初めて知りました。

自分のエクセルは立ち上がりました。

しかし、問題はあります。
「Dos窓が表示されてしまう」のです。
#consoleというのがDos窓を前提にしているようですが
やはり、ActiveBasicのEXEファイルから立ち上げるわけですから
「なん~となく、格好悪い」気がします。
Hideする命令がありますか?

それとKillでエラーになります。(OSはXP)
生意気なことを言ってすみません。
ご助言を頂けたら幸せです。


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月25日(土) 22:53 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
私のうまくいっていないというのは解決しました。
後はインターフェイスの宣言を移植するだけです。
しかしExcelの量は半端ではないです。思わずタイプライブラリからABの宣言へ変換するプログラムを書いたほうがいいのかと考え込むほどでした。
もちろん使うものだけしか真面目に宣言しませんよ。

> ただ「+」「¥q」「¥¥」などの記号の意味が解りませんが
+ は文字列連結の演算子です。
VB系では & の方が一般的だと思いますが,ABでは専ら + を使っていますね。

\qや\\はヘルプのキーワードから「Ex 表記による文字列」で該当する項目を引けます。


ページトップ
   
 
投稿記事Posted: 2006年2月26日(日) 08:37 
イグトランス様、おはようございます。
エクセルの起動の件では、大変ご苦労をおかけし恐縮しております。

「後はインターフェイスの宣言を移植するだけです。」
という作業をなさっているようですが、
成功の折には、その恩恵でABの利用者が「超拡大」すると思われます。
ぜひお願いします。気長に期待しております。

------------
ヘルプの件ですが
大変親切なご指導ありがとうございます。
こんな事まで気を配って頂けるとは思いもしませんでした。
自分では今までのVBA経験と比較しながらそれなりに
「翻訳」出来てはいたのですが、
ヘルプの使い方に少し「くせ」があるようですね。
      (初心者のわりに生意気だと思います)
-------------
希望の星イグトランス様
これからもよろしくお願いします。


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月26日(日) 13:03 
オートメーションは私も興味があってやっていることですから,大して苦ではありません。

http://www.discoversoft.net/forum/viewtopic.php?t=775
 順調だと思っていたらこのざまです。Runメソッドが山ほど引数を取っていてどうしようもないです。

 次善策はここだけ「Visual C++」でDLLを作ることです。
Visual C++はコンパイラのCOMサポートが充実しているので,肝心の部分は意外と簡潔に書けます。
#ABもいつかVC++並にCOMやオートメーションが簡単になってほしいものです。

 たとえば元のVBSと同じことを実行するVC++でのコードは次のようになります。  tryの中がキモで,あとは準備や後片付けです。
#importはVB/VBAの参照設定に当たるものだと思えば構いません。
また,Excelのインスタンスが残るのが嫌なので,Quitの呼び出しを追加しています。

 というわけでDLL化します。  これのABでの宣言はこうなります。
コード:
Declare Function ExecExcelMacros Lib "EEM.DLL" Alias "_ExecExcelMacrosA@8" (FilePath As BytePtr, MacroName As BytePtr) As HRESULT
Declare Function ExecExcelMacrosW Lib "EEM.DLL" Alias "_ExecExcelMacrosW@8" (FilePath As *WCHAR, MacroName As BytePtr) As HRESULT
Declare Function ExecExcelMacrosA Lib "EEM.DLL" Alias "_ExecExcelMacrosA@8" (FilePath As BytePtr, MacroName As BytePtr) As HRESULT
Declare Function eemGetLastErrorMessageW Lib "EEM.DLL" Alias "eemGetLastErrorMessageW" () As *WCHAR
Declare Function eemGetLastErrorMessageA Lib "EEM.DLL" Alias "eemGetLastErrorMessageA" () As BytePtr
Declare Function eemGetLastErrorMessage Lib "EEM.DLL" Alias "eemGetLastErrorMessageA" () As BytePtr
 たとえばこう使います。
eemGetLastErrorMessageは最後のエラー発生時のエラーメッセージを返す作りになっています。
コード:
#strict

Dim hr As HRESULT
hr = CoInitialize(0)
If hr <> S_OK Then
	Dim ErrorMsg As String
	ErrorMsg = GetErrorStr(hr)
	MessageBox(0, StrPtr(ErrorMsg), 0, MB_ICONERROR)
	End
End If

If ExecExcelMacros("H:\Test.xls", "Auto_open") <> S_OK Then
	MessageBox(0, eemGetLastErrorMessage(), 0, MB_ICONERROR)
End If

CoUninitialize()

End

Const LANG_USER_DEFAULT = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)

Function GetErrorStr(dwMessageId As DWord) As String
    Dim pszMsg As BytePtr
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER Or FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _
        NULL, _
        dwMessageId, _
        LANG_USER_DEFAULT, _
        VarPtr(pszMsg), _
        0, _
        NULL)
    If Not pszMsg = NULL Then
        GetErrorStr = pszMsg
        LocalFree(pszMsg)
    End If
End Function
 ところで,NoWestさんのコードでもPrint "Excel起動中"の行さえ削除すれば#console抜きでコンパイルできるはずです。


ページトップ
   
 
投稿記事Posted: 2006年2月26日(日) 17:22 
ゲスト様、こんにちは。
突然、巨大なブラックホールが太陽系に近づき、
銀河系と融合しようとしている感じです。
自分のような無知な人間はオロオロするだけです。

多分、示されたコードはオートメーションを考慮中の方々への
サジェスチョンの様な事だと思いますが、
自分には全く理解できません。(当たり前)

-------------
>ところで,NoWestさんのコードでもPrint "Excel起動中"の行さえ削除すれば#console抜きでコンパイルできるはずです。

なーるほど、Dos窓は表示されず、たしかに私の目的は達成できます。
すばらしいと思います。
ABがほんの少し理解出来たような感じがします。
巨大ブラックホールの「絶大な力」を感じました。

生意気だとは思いますが、
やはり、ABによる「正当な立ち上げ??」を期待いたします。
生意気を、ご容赦願います。


ページトップ
   
 
 記事の件名:
投稿記事Posted: 2006年2月26日(日) 21:12 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
2つ上のも私です。またまたうっかりログインしないまま書いてしまいました。

 前回書き忘れましたが,VC++も無料で手に入ります。
#つまり無料であると言うことが売りになりづらくなりABやその他フリーを売りにしてきた言語には厳しいわけです。
そんなわけでVC++を使ってみたわけですが,このDLLを作るためだけにVC++をインストールするのは手間が大きすぎるのがネックです。
#VC++だけならよいのですが,Platform SDKまでインストールする必要があるので……。

 私はWebサイトをもっていないので,当分ここにDLLを置いておきます。
http://briefcase.yahoo.co.jp/game_oi2/
 使用例はもちろん前回の投稿のとおりです。宣言とプログラム本体を1ファイルにしてコンパイルして,問題なくできるはずです。

 邪道ですか?すいません。
しかし例のバグが直らない限りどうしようもないので,せめてそれまでの辛抱ということで。


ページトップ
   
 
投稿記事Posted: 2006年2月27日(月) 07:26 
巨大ブラックホールと希望の星が同一の方とは、自分の判断力では無理でした。
振り返ると「超親切」なところはそっくりでした。

>邪道ですか?すいません。

とありますが、自分には「えっ!!」て感じです。
なにか自分が批判的なことを言ったつもりはないのですが
     (VC++などを理解できない為)
その様にイグトランス様が受け取られたのでしたら
こちらのほうが、謝りたい心情で一杯です。
お許し下さい。

>しかし例のバグが直らない限りどうしようもないので,せめてそれまでの辛抱ということで。

頑張っていただいているイグトランス様に「敬意」を払っています。
今後とも是非頑張ってください。(結構、ずうずうしいです。)
「超新星の誕生」を期待しております。


ページトップ
   
 
 [ 12 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: CCBot, MSN [Bot] & ゲスト[0人]


トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean