[[20081217092235]] 『他のプログラムを操作』(てつ) ページの最後に飛ぶ

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

 

『他のプログラムを操作』(てつ)
 いつも参考にさせてもらってますが、最近会社のセキュリティーが厳しくなり、
 規則でネットへの書き込みが禁止されてしまいました。
 っで今日聞きたいのはかなり難しいのですが、

 会社で使っているパーソナルコミュニケーションというソフトをエクセルから
 操作したいのですがどのようにしていいかまったくわかりません。

 エクセルとそのソフトで何をしたいのかというと、エクセルのマクロで
 1.エクセルシートから調べたいデータを抜き出す。(完成)
 2.抜き出したデータをそのソフトにひとつずつ貼り付ける
 3.貼り付けて実行しホストから結果が反映されたデータをメモ帳に貼り付ける
 (抜き出したデータの数2,3を繰り返す)
 4.メモ帳のテキストファイルをエクセルにインポートする。(自作可?)

 *パーソナルコミュニケーションにはマクロ機能があり、エクセル上でコピーした
 状態でマクロを実行すると貼り付けてホストと更新してデータをコピーすることは
 可能でした。
 とすると必要なことはデータをコピーした状態でエクセルからそのソフトを
 アクティブにしてソフトのマクロを実行すると言うことを繰り返せばいいのかと
 思うのですが、他のプログラムの操作(アクティブ化)の仕方がまったくわかりません。
 説明不足は重々承知していますがよろしくお願いいたします。

 エクセルから他のアプリケーションを操作するか、他のアプリケーションから
エクセルを操作するかの選択でがらっと様相は変わりそうです。
ググって見たら次のようなものは見つかりました。
http://excelblog.14.dtiblog.com/blog-entry-208.html
マクロ言語としてVbscriptを利用しているようなので、
その辺が切り口になるでしょうか。
パーソナルコミュニケーションズというソフトが手元にある人で、
連携を試みている方がこの掲示板をご覧になっていると良いのですが。
(みやほりん)(-_∂)b

 みやほりんさんありがとうございます。私も上記リンクのサイトは見たのですが
 なんか解決できなさそうだったので。。。
 質問?の件ですがエクセルからマクロを実行して、
 そのソフトをアクティブ化(すでに起動させておいて)することは簡単に出来るのでしょうか?
 (てつ)

 AppActivate "メモ帳"
 ↑メモ帳がアクティブになります。

 (HANA)

 ありがとうございます。
 ではメモ帳をアクティブにして
 1.文字を入力する
 2.コピーしているものを貼りtける。
 はどうすればよいのでしょうか?
 (てつ)

 本当に動かしたいのは、メモ帳ではなく
 「パーソナルコミュニケーションズというソフト」
 なんですよね?

 取り敢えず、コピーしているものを貼り付けるのは
 SendKeys ("^V")
 で出来そうですが・・・・
 みやほりんさんご紹介のリンク先に有るように
 今出来ているコードからの改造して
 MACファイルを作成した方が良い様に思いますが。

 因みにパーソナルコミュニケーションズは持ってないので
 「こうやったら出来る」なんて事は言えませんが。 

 (HANA)

 エクセルVBAしかやってない立場からの発言になりますが、
「仕様のわからない」アプリケーションをExcelVBAで無理やり動かすよりも、
VBScriptを少し学習して、「パーソナルコミュニケーションズというソフト」
からExcelやテキストファイルを制御するマクロを作ったほうが確実のような
気がするんですけど。ExcelオブジェクトやExcelVBAのメソッドしか知らない
からでしょうけれども。
 
VBSでエクセルを起動する、って言うコードはこの学校でもいくつか紹介され
ています。マクロ警告を表示させないことを目的としたものが多いのですが、
参考になるはずです。
[[20041015103422]] 『マクロの警告』(ちぇしゃねこ)
[[20070223085711]] 『VBS』(純丸)
[[20050328104634]] 『シートに変化があったらメッセージを表示?』(レイビジョン)
[[20070708082707]] 『元に戻すマクロ』(チャリ子)
[[20080220154914]] 『マクロの警告』(OL)
[[20081030134803]] 『フォルダーを開くとエクセルが自動起動する方法』(yukipy)
[[20070405115251]] 『自動入力保存』(いか)
 
「パーソナルコミュニケーションズというソフト」を制御するマクロは、その
ソフトでできる。
VBSでエクセルを制御する方法は上記を参考に作っていけば何とかできそう。
テキストファイルはメモ帳を使わなくても生成できる。
1〜4を「パーソナルコミュニケーションズというソフト」から制御すれば、
VBAとVBSの記述方法はかなり似ているので、「多分出来るんじゃないでしょうか」。
(みやほりん)(-_∂)b

 同時送信になってしまいました。再度読み直しますが・・・
 パーソナルコミュニケーションズを動かしたいというか
 エクセル上でマクロを実行するとシートから必要なデータを
 抜き出してそのひとつずつをそのソフトに入れてその結果を
 メモ帳を介して再度エクセルに戻そうと考えています。
 それで今出来ないのが、
 抜き出した必要なデータを保持したままパーソナルコミュニケーションズを
 アクティブにし、”ENTER”キーを押し、”貼り付け”を行い、”コピー”し
 メモ帳に貼り付ける。ことです。
 誰もパーソナルコミュニケーションズを持っていないと思われますが、何か応用が利く
 方法があればと思っております。
 (てつ)

 ちょっと確認なんですが
 みやほりんさんが最初にご紹介のページに
 「記録言語に関しては
   VBスクリプト・ファイル と
   マクロ・ファイル
  を選択することが出来」
 とありますが

 >*パーソナルコミュニケーションにはマクロ機能があり、エクセル上でコピーした
 >状態でマクロを実行すると貼り付けてホストと更新してデータをコピーすることは
 >可能でした。
 これは、「その様なマクロファイルは出来た」ということなんですかね?

 「例えば、20行目のcall sdu610cという文字列を変更して
  18行目から22行目までを5回繰り返したい場合」
 の様に、抜き出したデータを該当部分に組み込みながら
 繰り返し処理が必要回数書いてあるVBスクリプトファイルを作成する。
 ということなら、そう難しくなく出来そうに思います。

 (HANA)

 そのパーソナル・・・でしたいことを記録したVBスクリプトファイルを貼り付けます
 ただマクロファイルとVBスクリプトファイルの意味がよくわかっていません。
 今日は会社で昨日勉強したことを少し試してみたんですが、どのようにして
 パーソナル・・・をアクティブにするのか(する必要すらない?)が解りませんでした。
 [PCOMM SCRIPT HEADER]
 LANGUAGE=VBSCRIPT
 DESCRIPTION=
 [PCOMM SCRIPT SOURCE]
 OPTION EXPLICIT
 autECLSession.SetConnectionByName(ThisSessionName)

 REM This line calls the macro subroutine
 subSub1_

 sub subSub1_()
   autECLSession.autECLOIA.WaitForAppAvailable
   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.SendKeys "[newline]"
   autECLMacro "[edit-paste]"

   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.SendKeys "[enter]"
   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.WaitForAttrib 2,63,"00","3c",3,10000

   autECLSession.autECLPS.WaitForCursor 2,64,10000

   autECLSession.autECLOIA.WaitForAppAvailable
   autECLMacro "[edit-copy]"

 end sub
 (てつ)

 残念ながら、何が記録されているのか、さっぱりわからんのですが、
たとえば、C:\にSample.xlsというブックを作ったうえで、
次のようなスクリプトを実行すると、Excelが起動し、Sample.xlsが
開いたりしませんか?
 
 [PCOMM SCRIPT HEADER]
 LANGUAGE=VBSCRIPT
 DESCRIPTION=
 [PCOMM SCRIPT SOURCE]
 OPTION EXPLICIT
 autECLSession.SetConnectionByName(ThisSessionName)

 REM This line calls the macro subroutine
 subSub1_

 sub subSub1_()
 Dim xlApp
 Set xlApp = CreateObject("Excel.Application")
 xlApp.Visible = True
 xlApp.Workbooks.Open "C:\Sample.xls"
 Set xlApp = Nothing
 end sub
 
これでPCOMMのほうからExcelが起動するようなら、(多分)PCOMMから全部操作可能です。
エクセルで何か作業をして、ほにゃららのソフトで貼り付けして、という
繰り返しコマンドはなんとなく出来そうな感じです。
ただし、その様子だと(大変失礼な言い方ですが)コードの自作はすぐには無理そうですし、
私に作れといわれても、PCOMMの挙動を確認できないので、無理です。
従って、代理店や出入りの業者を捕まえて、
「??万円出すから、これこれこういうマクロを作ってくれ!」
が早いのではなかろうか。
(みやほりん)(-_∂)b

 みやほりんさんありがとうございます。
 エクセルでマクロ?それはVBE?を勉強しだして、会社での簡単なエクセル上での
 プログラムは作れるようになったんですが・・
 明日会社で試して見ますが、その前に少しだけさらに質問をさせてください。
 1.みやほりんさん提示のプログラムでエクセルを開きますが、
 仮にSHEET1のA1セルからA100セルの値をひとつずつコピーして
 私が提示したプログラムににつなげたいのです。
 ちなみに記録したマクロの中身は
 ENTER+貼り付け+コピーだけです。
 わがままばかり言ってすいません。
 (てつ)


 [PCOMM SCRIPT HEADER]
 LANGUAGE=VBSCRIPT
 DESCRIPTION=
 [PCOMM SCRIPT SOURCE]
 OPTION EXPLICIT
 autECLSession.SetConnectionByName(ThisSessionName)

 REM This line calls the macro subroutine
 subSub1_

 sub subSub1_()
 Dim xlApp,xlBk,xlSh,C
 Set xlApp = CreateObject("Excel.Application")
 xlApp.Visible = True
 set xlBk = xlApp.Workbooks.Open("C:\Sample.xls")
 set xlsh = xlbk.Worksheets("Sheet1")
 For Each C In xlSh.Range("A1:A5")
 msgbox C.Value
 Next
 Set xlApp = Nothing
 end sub
 
A1:A5でやってみます。
msgbox C.Value の部分がたぶん「やりたいこと」に置き換わります。
(みやほりん)(-_∂)b

 本当にありがとうございます。
 明日試してみます。
 自動記録で出てきた一部ですが
 autECLSession.autECLOIA.WaitForInputReady
 これがVBSかなーっと思ったらそうじゃないみたいですね。
 で検索したらほとんど出てこなかったんですが、いいサイトがひとつあったので
 少し勉強してみますが、またわからないことが出てきたら よろしくお願いします。
 ちなみに上で書いているプログラムは何ですか?VBS?
 何を勉強していいやら。とりあえず今日は大進展です。
 (てつ)


 それもVBSですし、私が提示しているのもVBSです。
VBAもVBSもVisualBasicから派生したものだと思っておけば、良いでしょう。
だから、基本的に書き方が似ています。
覚書
http://publib.boulder.ibm.com/infocenter/pcomhelp/v5r9/index.jsp?topic=/com.ibm.pcomm.doc/books/html/host_access02.htm
(みやほりん)(-_∂)b

 私もちょうど同じサイトを見てました。
 ただどれがそれか解りませんでしたが、 C++とかJAVAとかあって
 ただ自動記録で出てきたのが自動化オブジェクトあたりかなっと思うので
 そのあたりを見ればいいのかと思いながら・・・
 ただ会社で使っているのがかなり古そう(10年以上)なのでどうか解りませんが。
 C++ってとことも使えるのですかね? 
 やぱり どこを見ていいのかよくわかりません。
 (てつ)

 エラーになりました。
 どうやらエクセルを開けないのかと思うのですが・・・
 (てつ)

 PCOMMのマクロからやるのであればSample.xlsを変換してSample.csvにしたほうが。。。
 (@@@@@@@)

 >エラーになりました。
そうですか。
 Dim xlApp,xlBk,xlSh,C 〜 Set xlApp = Nothing の部分はVBSとして単体では問題なく
動くことは確認しています。
"C:\Sample.xls"を作らないで確認しているということは、ありませんよね?
 
これで動かないというということなら、私が太刀打ちできるレベルではありません。
ごめんなさい。
[@@@@@@@]さん、もし制御方法が分かるのなら、
お願いできませんか?
(みやほりん)(-_∂)b


 ここまでよんで何をしたいのかさっぱりわからないし、
 >ただ会社で使っているのがかなり古そう(10年以上)なので・・・
 PCOMMのバージョンが違うと再現できないですから、

 >代理店や出入りの業者を捕まえて、
 >「??万円出すから、これこれこういうマクロを作ってくれ!」
 のほうが良いと思われます。
 (@@@@@@@)

 相変わらず仕事の合間に少しずつ勉強して頑張っております。
 先日エクセル側からの制御で一通り完成したのですが、
 同期?出来ずにちょくちょく時間を止めている為時間がかかって仕方ありません。
 今日ふと過去に見たサイトエクセルからPCOMMのマクロを作成するというところ
 に戻りようやく意味がわかりました。
 でエクセル側からVBS?を作ってみたのですが、クリップボードに保存できる?容量が
 足らずにうまいこといきませんでした。

 Buf = Clipbord.Gettextとやったのですがうまいこといきませんでした。
 VBSではどのように書けばよいのでしょうか? 
 あっちにいったり、こっちにいったりですいません。
 (てつ)

 以前みやほりんさんが提示していただいたコードの 
 REM This line calls the macro subroutine
 を
 'REM This line calls the macro subroutine
 とするとエクセルがひらくれるようになりました。
 まだあまりどのようにすればよいかということが見えていませんが
 まずは報告だけさせていただきます。
 (てつ)

 ちょっと似たような事をやったので書きこんでみます。
 ・・・と言っても、アプリケーションが違いますが。。。

 そこで
 >そのパーソナル・・・でしたいことを記録したVBスクリプトファイル
 を貼り付けていただいていますが、このファイルと組み合わせて
  1.クリップボードにデータをコピー
  2.スクリプトの実行
  3.クリップボードからデータを取り出す
  4.クリップボードに次のデータをコピー
  5.スクリプトの実行
  6.クリップボードからデータを取り出す
 ができれば良いのでしょうか?

 それとも、毎回の実行(2と5)時に スクリプトファイルの内容で
 書き換える必要がある部分があるのでしょうか?

 たとえば、コード内の

 固定ではないのでしょうか?
 戻り値によって変化するのでしょうか?
 事前に分かっているのでしょうか?

 それから、一番重要な点としては
  センドキーで 指定したスクリプトの実行 ができるのかどうか
 という点ですが、いかがでしょう。

 センドキーで実行できる
 スクリプトは、固定(あるいは戻り値によって変化しない)
 のであれば、
  エクセルで クリップボードにデータをコピー
  センドキーでスクリプトを実行
  エクセルで クリップボードからデータを取り出す
  (エクセルで、スクリプトの作成)
 の繰り返しで出来そうな気がします。
 (気のせいかもしれませんが。笑)

 (HANA)

 HANAさんありがとうございます。 
 今日まで仕事に追われていてアレから進んでいなかったのですが、

 まずは質問の答えに答えます。わけのわからない数値の部分は
 無視しても良いような気がします。
 エクセルのマクロでPCOMMで実行するプログラムを作成する方法ですが
 PCOMM上でCOPYしたものがクリックボードに張り付くのですが、
 そのものを変数に入れることが出来れば完成すると思っています。
 PCOMMでPCOMMで動くマクロを実行させる方法がわからない為
 ショートカットキーを設定し、SENDKEYSでキーを送り実行させています。
 最近いじってなくてうる覚えですので明日再度マクロを確認します。
 とりあえずPCOMMのマクロでクリックボードの値を変数に入れれさえすれば
 解決すると思っております。
 (てつ)

 えっと・・・・
 >PCOMMのマクロでクリックボードの値を変数に入れれさえすれば
 それって
 「autECLMacro "[edit-paste]"」
 の部分が該当するんじゃないんですか?

 それとも、これとは別のコードの話ですかね・・・?

 (HANA)

 「autECLMacro "[edit-paste]"」はPCOMMに貼り付けです。
 今メールを見ていたら、マクロが出てきました。
 少し貼り付けます。
 エクセル側で実行してdic2のxにPCOMMで調べたい値を入れていきます。
 そしてエクセルからPCOMMマクロを作成する部分の一部ですが・・・
 Const sFilePath = "C:\Program Files\Personal Communications\private\TEST.MAC" 
 'ヘッダー 
 Open sFilePath For Output As #1 
 Print #1, "[PCOMM SCRIPT SOURCE]" 
 Print #1, "OPTION EXPLICIT" 
 Print #1, "autECLSession.SetConnectionByName(ThisSessionName)" 
 Print #1, "REM This line calls the macro subroutine" 
 Print #1, "subSub1_" 
 Print #1, "autECLSession.SetConnectionByName(ThisSessionName)" 
 Print #1, "REM This line calls the macro subroutine" 
 Print #1, "subSub1_" 
 Print #1, "sub subSub1_()" 
 '省略 ‘繰り返し部分() 
 For Each x In dic2 
 Print #1, "autECLSession.autECLOIA.WaitForAppAvailable" 
 Print #1, "autECLSession.autECLOIA.WaitForInputReady" 
 Print #1, "autECLSession.autECLPS.SendKeys """ & x & """" 
 Print #1, "autECLSession.autECLOIA.WaitForInputReady" 
 Print #1, "autECLSession.autECLPS.SendKeys ""[enter]""" 
 Print #1, "autECLSession.autECLOIA.WaitForInputReady" 
 Print #1, "autECLSession.autECLOIA.WaitForAppAvailable" 
 Print #1, "autECLMacro ""[edit-copy]""" 
 Print #1, "autECLSession.autECLOIA.WaitForInputReady" 
 Print #1, "autECLSession.autECLOIA.WaitForAppAvailable" 
 Print #1, "autECLMacro ""[F11_0130]""" ’←これも出来ないだからSENDKEYSでしようかと・・・ 
  
Next 'フッター 
Print #1, "end sub" 
Close #1 
MsgBox "完了" 
'DoEvents 

 簡単にプログラムの説明ですが、SendKeys ""[enter]""" は実行ボタンです
 ""[F11_0130]"""は入力箇所を持っていったり、特定文字を探して次のページ
 へ移動して、値をコピーしたりしています。 そして最後に次の入力箇所へ
 送ってます。
 このNEXTの前にクリックボードの値を変数に入れてクリックボードを空白に出来れば
 ほぼ完成しそうです。
 てつ

 つまり、今のVBAコードの流れを大きく書くと
  1.処理する値の抽出(dic2に)
  2.スクリプトの作成
  3.スクリプトの実行
  End Sub
 で、作成されるスクリプトは
 (たとえば処理する値が 値1〜値3 まであった場合)
  A.ヘッダ
  B.値1に関しての処理→戻り値をクリップボードへコピー
  C.値2に関しての処理→戻り値をクリップボードへコピー
  D.値3に関しての処理→戻り値をクリップボードへコピー
  E.終了
 となっており、VBAが終了した段階では
  値3の戻り値のみクリップボードへ残っている(ので取り出せる)
  それまでの戻り値は取り出せない
 という事で良いですか?

 >このNEXTの前にクリックボードの値を変数に入れて
 >クリックボードを空白に出来ればほぼ完成しそうです。
 これは、「PCOMMの処理として」ということですか?
 でしたら、そのようなコマンドが用意されていないとだめだと思いますが。。。

 私は 2,3の後に4クリップボードの値を取り出す を入れて
 2〜4をループすれば良いのではないかと思っていますが。

 今は、2の中だけでループしていますよね。
 そうではなく、
   2-1.値1に関してのスクリプトの作成
  3-1.スクリプトの実行
  4-1.クリップボードの値を取り出す
  
   2-2.値2に関してのスクリプトの作成
  3-2.スクリプトの実行
  4-2.クリップボードの値を取り出す
  
   2-3.値3に関してのスクリプトの作成
  3-3.スクリプトの実行
  4-3.クリップボードの値を取り出す
  
  End Sub

 作成するスクリプトは
  A.ヘッダ
  B.値○に関しての処理→戻り値をクリップボードへコピー
  C.終了

 と言った感じで。

 もしかして
 >ショートカットキーを設定し、SENDKEYSでキーを送り実行させています。
 これって
 「エクセル側から スクリプトの実行方法はわからない」
 ってことですか?
 ショートカットキーは、どこに作っているのですかね。
 >SENDKEYSでキーを送り
 ってことは、VBA ですよね・・・?

 (HANA)

 少し違います。
 Dic2にいれた調べたい値の数すべてがひとつのスクリプトになります。
 つまりエクセルでスクリプトを作成する。その後 PCOMMで手動でスクリプトを
 実行させようとしています。
 クリックボードにどんどん追加していく機能もあるのですが、それをやった際
 調べるデータが多いと、すべてクリックボードに収まらないことが判明したため
 一度変数に入れてしまおうと考えたわけです。
 またショートカットキーはPCOMM側で登録できるショートカットキーです。
 ちなみにエクセル側からスクリプトの実行方法はわかりません。
 そのため、PCOMMでショートカットキーを設定し、SENDKEYSでスクリプトを実行させることは出来ています。
 (てつ)

 [御参考]この人の回答にプログラムが・・・
 http://www7.big.or.jp/~pinball/discus/as400/29463.html
 (dack)

 あぁぁっ、朝から書いていたのにこのタイミングで衝突。
 しかも2回も。(笑)

 >少し違います。 
 ですがその方法を変えないとすると
 スクリプトの中に
  変数に格納する
 と言うコードが必要になり
 これはVBAの話しでは有りません。
 PCOMM側のコード(スクリプトにどの様に書くか)の問題になってきますよね。

 そこで考えてみたのが
  2〜4をループ
 です。
 サンプルコードを作ってみました。
 勿論、環境が無いので動かしていません。
 詳細はそちらで詰めてもらうことになると思います。
  ・場合に依っては、待ち時間の設定が必要かもしれません。
  ・==PCOMMをアクティブにする==は、SendKeysの前に
   毎回行った方が良いかもしれません。

 変数を新しくいくつか使っていますので
 既に有るものと重複しないように変更して下さい。
 結果の書き出しを Sheet1のA:B列にしています。
 まずは簡単に Sheet1(の名前のシート)を新規作成して
 やってみてもらうのが良いかもしれません。

 また、VBEメニューの
 ツール(T)→参照設定(R) で
  Microsoft Forms 2.0 Object Library
 にチェックを入れておいて下さい。

 '------
Const sFilePath = "C:\Program Files\Personal Communications\private\TEST.MAC"
    '
Dim rs, rsi As Long
Dim br As New DataObject
    '
    '======================================================
    '1.このあたりに dic2 にデータを作成するコードを入れる。
    '======================================================
    '
    '結果を入れる配列を作成
ReDim rs(1 To dic2.Count, 1 To 2)
    '
    '==PCOMMをアクティブにする==
AppActivate "アプリケーション名"  '←−−−★要変更
    '
For Each x In dic2
    '==2.スクリプトの作成==
    Open sFilePath For Output As #1
        Print #1, "[PCOMM SCRIPT SOURCE]"
        Print #1, "OPTION EXPLICIT"
        Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"
        Print #1, "REM This line calls the macro subroutine"
        Print #1, "subSub1_"
        Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"
        Print #1, "REM This line calls the macro subroutine"
        Print #1, "subSub1_"
        Print #1, "sub subSub1_()"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys """ & x & """"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[enter]"""
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLMacro ""[edit-copy]"""
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLMacro ""[F11_0130]"""  '←これも出来ないだからSENDKEYSでしようかと・・・
        Print #1, "end sub"
    Close #1
    '
    '==3.実行==
    SendKeys "スクリプトの実行", True   '←★要変更(ショートカットキーに)
    '
    '==4.結果格納==
    rsi = rsi + 1
    rs(rsi, 1) = x
    br.GetFromClipboard
    rs(rsi, 2) = br.GetText
Next
    '
    '==結果書き出し==    ←−−−−−−−−★要変更(書き出しシート名・位置 等)
    With Sheets("Sheet1")
        .Range("A:B").ClearContents
        .Range("A1:B1").Value = Array("処理データ", "結果")
        .Range("A2").Resize(rsi, 2) = rs
    End With
    '
MsgBox "完了"
'DoEvents
 '------

 (HANA)

 >しかも2回も。(笑)
 ごめんなさいwリンク先がTOPページでは無かった事に
 後から気づいて修正してましたw
 (dack)

 スクリプト部分を見ていて思ったのですが
        Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"
        Print #1, "REM This line calls the macro subroutine"
        Print #1, "subSub1_"
 この部分って重複してますよね?

 それから
        Print #1, "autECLMacro ""[F11_0130]"""  '←これも出来ないだからSENDKEYSでしようかと・・・
 のコメントも気になります。

 最初の書き込み時にあった よくわからない値が出ている
 2行も、今回のものには無いようです。

 このスクリプトは単独で正確に
 (もちろん x 部分は相応の値を入れて ですが)
 動くのですか。。。?
 それとも、スクリプト自体が まだ試作段階なのですか?

 (HANA)

 返信遅くなりすいません。 現在会社からの投稿禁止中です。
 まずは質問の答えから上に張ったプログラムは実証済みです。
 ただし格納したxが少ない場合でなおかつ
 autECLMacro ""[F11_0130]"""  をF11でショートカットキーで設定した場合です。
 一応うまく動きました。 エクセルでスクリプトを作成し、クリックボードに
 入るだけ入れた場合は・・・ (PCOMMにはクリックボードにクリックボードの値+現在の画面の値(文字列)を記録させることが出来ます)

 っでひとつ提案というかお願いですが、エクセルからPCOMMのスクリプトを作成する際に
 クリックボードの値を変数に入れるのではなく、メモ帳に貼り付けていく方法をすれば
 待ち時間を設定することなく出来るような木がするのですが。。。
 HANAさんの提示してくれたコードの3番部分をメモ帳に貼り付ける、そしてクリックボードの
 値をクリアーする。にしてすべてスクリプトで作成してしまうという方法ですが 
 どうでしょう????
 (てつ)
 いま頭がまったく働いていませんが、会社で投稿っをよんでいて思ったことです

 色々お伺いしたいことが有るのですが
 取り敢えず、少しずつ確認させて下さい。

 1.「一応うまく動きました。」
  ってのは、私が載せたコードの事ですか?
  それとも「質問の答えから上に張ったプログラム」の事ですか?

 2.自動プログラムは何が出来ているのですか?
   「先日エクセル側からの制御で一通り完成したのですが」
  これは『戻り値の書き出しまで出来ている』と言う事ですか?
  その場合、どの様な操作なのですか?

 (HANA)

 返信が遅くなり、すいません。会社から書き込めないもので・・・
 1.うまく出来た=上に張ったプログラム
 というか、PCOMMで実行するプログラムをエクセルで書き出して
 実行させる用法です。
 ただし条件があり、"autECLMacro ""[edit-copy]"""をedit-copyapendといい
 どんどんクリックボードに貼り付けていく場合でなおかつ""[F11_0130]"""  の
 マクロを実行しない方法ですが。
 2ですが、エクセル側からの制御では実はうまく出来ています。 
 しかしPCOMMの応答があるまで時間をとめていますので、時間が間に合わない場合など
 どんどんWAITTIMEが増えていき、数秒ほど待たしていますのでマクロ実行に
 ものすごく時間がかかっています。

 っで私の考えでは待ち時間を制御できるなら、エクセル側からのマクロ実行で
 問題なく使用できると思っています。現状マクロ実行中PCを使用できません
 (あるいはバックグラウンドで作業してくれれば問題ありません)

 HANAさんの提示していただいた昨日の方法ですが、結局待ち時間を設定するとなると
 現状の2番と同じことにならないかと・・・
 (エクセル側からの操作だとFLGを用いれば出来るのかも・・・???)

 昨日私が考えた方法はエクセルでPCOMMでのスクリプトをすべて書き出してしまう方法ですが、
 PCOMMからエクセルを開けるなら、PCOMMからメモ帳を開いて、そこにクリックボードの
 値を貼り付けていき最後にメモ帳の値をすべてコピーし、エクセルに貼り付ける方法です。
 今日会社でトライしてみたのですが、うまいこといきませんでした。
 というかコードが全然書けませんでした。
 PCOMMのマクロの中身は
 PCOMMに入れたい値を入れる→結果を得る→F11_0130のマクロを実行する→
 クリックボードの値をメモ帳に貼り付けるをX回繰り返す→最後にエクセルに張る
 ・今の問題点はF11_0130のマクロを実行させ方がわからない。
 (PCOMMからSENDKEYSできないかも?最悪F11_0130のマクロ中身を書き出せばOKかも)
 ・メモ帳を開けない
 です。 今日明日は回答できると思いますのでよろしくお願いします。
 DACKさん情報ありがとうございます。 
 (てつ)

 私は 現在出来ているコードがどの様な物か分かりません。
 PCOMMは、どの様な時に応答が無くなりますか?

 現在使って居られるコードと私が載せた方法と
 どちらが待ち時間が少ないかは やってみないと分からないです。
 同じ作りなら同じだけ時間が掛かります。
 作りが違うなら、やってみれば良いと思います。

 動かしてみないと、何処でどれだけ待ち時間が必要か
 或いは待ち時間が必要でないか 分からないのですから。

 結局、
 >現状の2番と同じことにならないかと・・・
 思って、試して居られないと言う事ですね。

 (HANA)


 今日はあまり時間がなくて少ししか試せなかったのですが、少しだけやりました
 今繰り返しよんでっみると、あまり理解できていなかったかもしれません。
 おっしゃるとおりで、エクセルでSENDKEYSごとに1−2秒待たしていることを思うと
 PCOMMのマクロの方が早いので間違いなくスピードは上がりますね。

 PCOMMは応答がなくなるというよりは、PCOMMとエクセルは非同期?なため
 エクセルのマクロが次々に進んでいってしまい全然異なることをしてしまいます。
 すべてのSENDKEYSごとに1−2秒待たしている状況です。

 今いけるかもという気になってきましたが、待ち時間をどうしようかと
 頭の中でくるくる回ってます。
 1.エクセルで調べたい値(ひとつのみ)を調べるMACファイルを作成する。
 2.F10等ショートカットキーを設定し、1のマクロを実行する。
 (3. おそらくPrint #1, "autECLMacro ""[F11_0130]"""が出来なさそうなので
 ショートカットキー(F09等)を実行する。
 4クリップボードを配列に入れる。
 5. 1から4を繰り返す。
 6.エクセルに貼り付ける。

 なんかいけそうな気がしてきましたが、PCOMMでの終了(待機状態)を把握するために
 PCOMMのマクロにフォルダにOK.txt等のファイルを作成さセルようにすればよいのかも?
 月曜日に再度挑戦したいのですが、PCOMMまたエクセルでファイルを作成または削除する
 方法を教えてもらえないでしょうか?
 試してもいないのにへんなこといってすいません。
 よろしくお願いします。
 (てつ)


 やってみてください。

 >PCOMMでの終了(待機状態)を把握する
 必要があるなら、その時のことでしょう。

 毎回処理に同じだけ時間がかかるなら
 同じ時間待たせるだけで良いと思いますが。

 (HANA)

 今日仕事の合間にやったのですが、時間切れで出来ませんでした。
 また明日報告いたします。
 なんとなくうまいこといきそうです^^
 (てつ)

 ご連絡、ありがとうございます。

 これは・・・・
 たぶん うまいこといきますよ。(笑)

 問題は、「PCOMMだけで・・・」というご要望ですが
 こちらに関しては、全く分かりません。
 最初にみやほりんさんご紹介のページにあるもの
 (現在試している方法)のコード(スクリプト?)と
 dackさんご紹介のページにあるコードは
 あまり似ているとは思えません。

 みやほりんさんが「覚書」としてリンクしておられるページを見ると
 色々な書き方(言語?)が使える様に思います。
 そして、現在行っている方法は そのうちの
 一番自由度の低い書き方なのではないかと思います。

 現在、PCOMMのコードに関して持ち得る情報は
 記録で得られたコードです。
 そして、エクセルのマクロの記録で得られたコードをどれだけ眺めても
 ループ処理や、○○へ書き出す処理 が出来ないように
 PCOMMでも、得られたコード以上のものは出来ないと思います。

 自由を得るためには、
 上でみやほりんさんが書いておられますが
 やはり、VBAからの脱却 が必要になるのではないかと思います。

 現在エクセルのVBAから PCOMMを動かしていますよね。
 (スクリプトを作ったり、実行のきっかけを与えたり)
 これを、PCOMMからエクセルのデータを参照する。

 PCOMMはVBAが使えませんので、その他の言語の学習が
 必要になってくると思います。
 また、その他の言語であれば エクセルの学校ではなく
 そのような板(は探してもらう事になりますが。。。)
 で質問していただいた方が良さそうに思います。

 >代理店や出入りの業者を捕まえて、
 >「??万円出すから、これこれこういうマクロを作ってくれ!」
 と言うのは難しいと思いますが
 良く知っている人と仲良くなって
 「こんな事をしたいんだけど 何を勉強すれば良いか。」
 「今はこんなことをやっているけど 先はあるか。」
 と聞くくらいはやってみても良いのではないかと思います。

 私は、PCOMMがどのようなものか
(システムなのか、単なるアプリケーションなのか すら)
 分かっていません。

 まずは、dackさんご紹介のページにあるコードが
  何なのか。
  どうやったら動くのか。
  動いた場合、どの様にして動いているのか。
 考えてみる・・・かな。 

 (HANA)


 こんばんは返信遅くなりました。ようやく仕事がひと段落しました。
 昨日今日と試してみましたがまず報告から。下に向きました部分でうまいこといきません。
 (理由はなんとなくわかっています)
 まずHANAさんに誤解させてしまってますが、PCOMMクリックボードから得る値は改行つきの文字です。
 そのためrs(rsi, 2) = br.GetTextでエラーになります。
 よって私で少し加工しrsをSTRINGとし、rs=br.GetTextに変更しました。
 ただしRange("A2") = rsとしてしまうと、すべてA2に入れようとしてしまいます。
 そこでrsを再度クリックボードに入れて、activesheet.pasteとするとか??
 ただどうすればよいかあまりわかっていませんが・・・ (コードの下につづく)

     rs(rsi, 2) = br.GetText
Next
    '
    '==結果書き出し==    ←−−−−−−−−★要変更(書き出しシート名・位置 等)
    With Sheets("Sheet1")
        .Range("A:B").ClearContents
        .Range("A1:B1").Value = Array("処理データ", "結果")
        .Range("A2").Resize(rsi, 2) = rs
    End With

 ちなみにこのコードで時間は半分以下には短縮できました。^^
 で待ち時間を設定することについてですが、エクセルでも毎回マクロが完了するまでに
 同じ時間でないようにPCOMMでも毎回同じ時間ではないです。(何が影響するか不明)
 でトラブルを招かないためにも長めに待ち時間を設定しています。
 微妙に無駄なことをしているなーっとおもいながら・・・
 (てつ)


 職場から見ることは出来るのですかね?
 まず最初にお願いですが
 >よって私で少し加工しrsをSTRINGとし、rs=br.GetTextに変更しました。
 でしたら、そのコードを載せて下さい。

 「rs(rsi, 2) = br.GetText」の一文を
 rs = br.GetText
 Range("A2") = rs
 に変えてやってみた って事ですよね。
 >すべてA2に入れようとしてしまいます。
 と言う不具合はあるものの。

 待ち時間は・・・・どのくらい設定しているのですかね。
 そのあたりの詳しい情報は興味が在る所です。

 例えば、通常は○○秒で良いが 長めに××秒にしている とか。
 一回の処理で5秒以上待ったりするのですか?

 どの様にして確認をとるかは 色々な方法が有ると思いますが
 エクセルが何かを見て判断するので有れば それだけ
 本来の作業(PCOMMでの作業)以外の作業がそのPC上で行われる
 と言う事ですので、本来の作業を阻害して仕舞う可能性も有ります。
 (可能性だけで、実際は問題になる程の事では無いかもしれません。)

 VBAだけで考えるとすると、クリップボードから値を取り出したら
 中身を空にして、次にクリップボードに値が入るまで
 ループ待機をさせておけば良いように思います。
        With br
            Do While rs = ""
                DoEvents
                .GetFromClipboard
                rs = .GetText
            Loop
                .SetText ""
                .PutInClipboard
        End With

 ただし、PCOMMが作業途中でクリップボードに値を入れていたら駄目ですが。
 また、一番最初に「""」を入れる処理をしておいた方が良いと思います。

 それから、データが一つのセルに入ってしまうのは
 Split関数で分割して、入れていけば対処出来そうです。
 全文検索で「Split 改行」を調べてみて下さい。

 こちらも「ただし」がありまして、 バージョンが97以前の場合は使えません。
 ご質問時は、エクセルのバージョンを書いておいてもらうのが良いと思います。

 (HANA)

 SPLIT関数がよくわからなかったため、結局最後にrsをクリックボードにいれ
 エクセルに貼り付けました。
 br.SetText rs
 br.PutInClipboard
 Sheets(LISTSHEET).Paste
 結果オーライです。
 >待ち時間は・・・・どのくらい設定しているのですかね。
 >そのあたりの詳しい情報は興味が在る所です。
 >例えば、通常は○○秒で良いが 長めに××秒にしている とか。
 >一回の処理で5秒以上待ったりするのですか?
 待ち時間の設定ですが、ログイン用のTSOマクロをエクセル側からsendkeysで
 送った場合は6秒、PRINTFで作成したTSOマクロを実行した場合は8秒の設定に
 なってしまいました。(本日20回ほど実験し、エラーになった場合に1秒ずつ追加)
 やはりPCの状態?やネットワークの状態?で3秒ほどの誤差がありそうです。
 ちなみに上に書いたF11-0130のマクロもPRINTFで同時に書いてます(下に表示)
 極力エクセルとPCOMMの移動を減らしたほうが良いかと思ったので。
 やはりこうなると、PCOMMの処理終了を何とかして把握したいですね・・・。
 クリックボードはいい案だと思ったのですが、PROINTFが50行ほどありますが
 20行目ほどでクリックボードに値を入れてしまっているので駄目かと思います。
 他の方法で何かいい方法が・・・
 いま書いていて思ったのですが、PCOMM上で範囲を選択してコピーするとその部分
 のみがコピーされます。ってことはPCOMMマクロの最後に一文字(必ず空白のところ)を
 選択しそれをPCOMMマクロの最後に追加することにより、PCOMMマクロの終了が
 把握できるかも^^ 明日やってみます。
 ちなみにエクセルで作成するPCOMMマクロの部分を記入します。
     Open sFilePath For Output As #1
        Print #1, "[PCOMM SCRIPT HEADER]"
        Print #1, "LANGUAGE=VBSCRIPT"
        Print #1, "DESCRIPTION="
        Print #1, "[PCOMM SCRIPT SOURCE]"
        Print #1, "OPTION EXPLICIT"
        Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"
        Print #1, "REM This line calls the macro subroutine"
        Print #1, "subSub1_"
        Print #1, "sub subSub1_()"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys """ & x & """"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[enter]"""
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLMacro ""[edit-copy]"""
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"

        Print #1, "Dim autPsObj 'As AutPS 'PCOMM.autECLPS.1"
        Print #1, "Dim FlgBoo 'As Boolean"
        Print #1, "Dim RowLng 'As Long"
        Print #1, "Dim ColLng 'As Long"
        Print #1, "Dim SearchStr 'As String"
        Print #1, "Dim LoopCounter 'As Long"
        Print #1, "Set autPsObj = autECLSession.autECLPS"
        Print #1, "SearchStr = ""秘匿のため文字変更"""
        Print #1, "Const NextPageStr = ""ジ PAGE アリ(PA1;ジPAGE ,=-1;ゼンPAGE)"""
        Print #1, "Const DATAPageStr = ""DATA CONTINUE"""
        Print #1, "FlgBoo = False: RowLng = 1: ColLng = 1"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[Enter]"""
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "If autPsObj.SearchText(SearchStr, 1, RowLng, ColLng) Then"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[newline]"""
        Print #1, "End If"
        Print #1, "Do While autPsObj.SearchText(NextPageStr, 1, RowLng, ColLng)"
        Print #1, "If autPsObj.SearchText(NextPageStr, 1, RowLng, ColLng) Then"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[PA1]"""
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLMacro ""[edit-copyappend]"""
        Print #1, "End If"
        Print #1, "Loop"
        Print #1, "Do While autPsObj.SearchText(DATAPageStr, 1, RowLng, ColLng)"
        Print #1, "If autPsObj.SearchText(DATAPageStr, 1, RowLng, ColLng) Then"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys "" [PA1] """
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLMacro ""[edit-copyappend]"""
        Print #1, "autECLSession.autECLPS.SendKeys ""[newline]"""
        Print #1, "End If"
        Print #1, "Loop"
        Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"
        Print #1, "autECLSession.autECLOIA.WaitForInputReady"
        Print #1, "autECLSession.autECLPS.SendKeys ""[newline]"""
        Print #1, "Set autPsObj = Nothing"
       ’ここに明日マクロの記録で調べる範囲を選択しコピーするマクロを追加
        ’選択するコード///
    ’Print #1, "autECLMacro ""[edit-copy]"""
       ’ここまで 
    Print #1, "end sub"
    Close #1

 本当にいろいろありがとうございます。
 ちなみに職場から見てますよ。 ウイルスページにいっちゃうと始末書ですが><
 (てつ)

 イメージが分かった気がします。

 取り敢えず↓Cドライブ直下に
 「test.txt」のファイルを作成する【スクリプト】です。
 メモ帳に貼り付け、VBSの拡張子で保存して下さい。

 '------
Dim objFileSys
Set objFileSys = CreateObject("Scripting.FileSystemObject")
objFileSys.CreateTextFile objFileSys.BuildPath("C:\","test.txt")
Set objFileSys = Nothing
 '------

 次に、Cドライブ直下の「test.txt」ファイルの有無を確認し
 見つかった場合 メッセージボックスを表示し、
 該当ファイルを削除する【マクロ】です。
 エクセルのVBEに貼り付けて下さい。

 '------
Sub ファイル確認()
Dim flg As Long
Do Until flg = 1
    If Dir("C:\test.txt") <> "" Then
        flg = 1
    End If
    DoEvents
Loop
MsgBox "ファイルがありました。削除します。"
Kill "C:\test.txt"
End Sub
 '------

 まず、「ファイル確認」マクロを実行。
 マクロ実行中に、スクリプトを実行。
 スクリプトの実行により「test.txt」が作成されたら
 メッセージボックスが表示されると思います。

 (HANA)

 とりあえずお伺いしてみますが。。。。

 >PCOMMクリックボードから得る値は改行つきの文字です。
 が、一回何行になるかは決まっているのですか?

 (HANA)

 HANAさん返事ありがとうございます。
 まず直上質問ですが、決まっていると思います。
 ただ月曜日までわかりませんが><
 そして昨日の夜書き込んだないようですが、
 今日仕事の合間にいろいろ試してみて、空白の一文字を取得することに
 成功したのですが、よーくよーく考えてみたら、クリックボードの値を書き換えて
 しまったらまったく意味がないことに会社で気づいてしまい、大声を上げてしまいました。
 ちょうどHANAさんがPCOMMからTEXT.txtの作成方法を書いていてくれて助かりましたが
 これも月曜日になってしまいます。><
 かなりゴールが近づいているような気がします。^^
 HANAさんがPCOMMでテキストファイルを作成するのはVBSですよね?
 これをきにVBSもかじってみます。
 (てつ)

 >これも月曜日になってしまいます。><
 それは構いませんが、単独でテストはしてくださいね。
 「PCOMMに入れたけど動かない」と言われてもわかりませんので。

 ちなみに
 >HANAさんがPCOMMでテキストファイルを作成するのはVBSですよね?
 ・・・・意味がわからないです。。。

 PCOMMが実行できるのは VBS ですよね。
 ですから、PCOMMに何かやらせようと思ったらVBSは必須ですね。

 現在のコードは、VBAが主体になっています。
 エクセルが主体で、PCOMMに指示を出しています。
 でも、VBSのコードが書けるようになれば おそらく
  1.VBAでデータを作成し、CSVで保存
  2.CSVデータを利用しVBSで処理
    (この中で、得られたデータを TEXTやエクセルに蓄積)
 という流れで処理が行えるようになると思います。

 ちなみに、一回の行数が決まっているのなら
 書き出し先のセルの位置が決まるので
 スクリプトが先に作っておけると思います。

 つまり、最初のマクロに近い形ですよね。
   Sub 
     1.処理する値の抽出(dic2に)
     2.スクリプトの作成
     3.スクリプトの実行
   End Sub
 で、2で作成するスクリプトが
 (たとえば、一回の行数が3行なら)
   A.ヘッダ
   B.値1に関しての処理→戻り値をクリップボードへコピー
     →A1セルから貼り付け
   C.値2に関しての処理→戻り値をクリップボードへコピー
     →A4セルから貼り付け
   D.値3に関しての処理→戻り値をクリップボードへコピー
     →A7セルから貼り付け
   E.終了
 ですね。

 VBSでも「ブックを新たに作成して 決められたセルへペーストする」
 というコードは、割と簡単に書けそうです。

 もしかすると、処理するデータ(dic2の内容)をどこかへ書き出し
 VBSで エクセルからコピー PCOMMに貼り付け
     結果をエクセルに貼り付け
 のコードが簡単かもしれません。
 (いつまでたってもエクセルからの脱却が計れませんが
  スクリプトの作成に関してはVBAから離れられそうです。)

 (HANA)


 なんとかうまいこと出来ました^^
 ただ仕事が忙しくて、あまり掘り下げて見れていませんのでもう少しお待ちください。
 あと行数の問題ですが、LOOPさせてるところで、行数が変わってしまうので・・・
 ただその倍数にはなるのですが。。。
 (てつ)


 その感触ですと
 「普通にVBSができれば、結構何でもできる」
 って感じですね。

 でしたら、このあたりと組み合わせれば
  VBAで 処理するデータ(dic2の内容)を作成し
      txtへ書き出し一度ブックを閉じる
  VBSで エクセル(閉じたブック)を開く
      書きだした情報を取得、実行、エクセルへ貼り付け
      次の情報を取得、実行、エクセルへ貼り付け
      次の情報を取得・・・・・
 が出来るようになるかもしれません。
 すると、念願の「裏で勝手に走ってて!!」が出来るかも?

 Happy!Happy!Island「4.3 既存のワークブックを開く」
http://www.happy2-island.com/vbs/cafe02/capter00403.shtml

 [VBScript Tips]「ファイル終端まで1行ずつ読み込む」
http://www.whitire.com/vbs/tips0072.html

 未入力行を探し、貼り付け
 '------
Dim objExcel, objWorkbook, objSheet
Dim x, i
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
  
Set objWorkbook = objExcel.Workbooks.Add()
Set objSheet = objWorkbook.Worksheets(1)
  
x=1
  
For i = x to x + 100
    If objSheet.Cells(i, 1).Value = "" Then
        Exit For
    End if
Next
objSheet.Cells(i, 1).PasteSpecial 
  
Set objExcel = Nothing
Set objWorkbook = Nothing
Set objSheet = Nothing
 '------
 上のスクリプトは
 For i 〜 PasteSpecial の間を
 複製して実行してもらうと
  新規エクセルを開き
  クリップボードにコピーされている内容が
  複製した回数下へ貼りついていきます。
 (クリップボードへ一度に100行以上コピーされるなら
  to 100 の数を増やして下さい。)
 ですから、「1行ずつ読み込む」のループの中に
 For i 〜 PasteSpecial が入る形になると思います。

   最終行の取得がわからなかったので、まわしていますが・・・
   上から確認しているので、貼り付けたデータに空行があると
   そこが最終行とみなされてしまいます。データの状態が
   そうなる場合があるのなら使えません。
   もしも何か良い方法が見つかったら きっぱり変更してください。

 ここまで来ると、さすがにエクセルから離れてしまいますので
 後はいろいろ(VBSの方)研究してみられると
 もっとそれっぽいものが出来そうに思います。

 と言うことで、こちらは一旦閉めて
 まだ対策が見つかっておられないのなら
 テキストボックスのコピーの方へ戻るのも良いかと思いますが。
 (ichinoseさんは、待ってくださっているのかな?
  と、思ってみたり・・・・。)

 (HANA)

 済みません、「未入力行を探し、貼り付け」のサンプルスクリプトには
 未入力行検索ループの後に
 「x=i」が抜けてますね。

 ・・・まぁ、ご使用になるなら
 って事ですが。

 (HANA)

 HANAさん返事ありがとうございます。
 って今頃すいません。
 とりあえずエクセル側からの操作で一通り出来ていたのですが、
 やはり、メール受信のダイアログでアクティブに出来なかったりなんかで
 やはりPCOMM側からの操作をしようと思うようになりました。
 エクセルから必要な部分を抜き出しエクセルファイルに保存←OK
 PCOMMでマクロを実行する。 ←9割くらいOK?
 (結果をTEXTファイルにしメモ帳に保存する)
 エクセルでそのメモ帳からデータを呼び込み操作する。←OKなはず

 でいろいろ教えていただいた方法などを用いて、PCOMMのマクロは9割
 完成しているような気がします。が もう一歩なんです。

 PCOMMでクリックボードに貼り付けられたものをメモ帳に貼り付けたいのですが、
 メモ帳に貼り付けるというかテキストファイルにしたいのです。
 VBSでクリックボードの値をテキストファイルにする方法ってありますか?
 (クリックボードを貼り付け、改行し、その下に次のクリックボードを貼り付けをLOOPさせます)
 (てつ)

 別にテキストにしなくても、クリックボードの値を変数に入れてしまってもいいのですが・・・
 (てつ)

 私の書き込み、読んでます?

 私は
 ・エクセルから必要な部分を抜き出し【テキスト】ファイルに保存
 ・PCOMMはテキストファイルを読み込む
 ・PCOMMは結果をエクセルシートに貼り付ける
 を提案しています。

 もちろん
 >PCOMMでマクロを実行する。 ←9割くらいOK?
 PCOMMがエクセルファイルからデータを取得しながら
 スクリプトを実行しているのなら、どこに保存してあっても
 関係ないですが。

 ちなみに、PCOMMからのデータ書き出し用の
 サンプルコードとして
 「未入力行を探し、貼り付け」
 を載せたのですが。
 「間に空白行があってうまくいかない」って事ですか?

 エクセルからデータを取得しているなら、面倒なことをしなくても
 エクセルに貼り付けも出来そうに思いますが。

 (HANA)

 どうもです。 エクセルに貼り付けることが出来ないんです。
 出来ないというか、エクセルに直接貼り付けると、列数が
 1列で張り付くことがあったり、2列で張り付くことがあったり、たまには
 3列で張り付いたりしてしまいます。
 (次の加工するときに定型のフォームでないため、加工しづらくなってしまいます)
 なおかつ上に書いてあるように、間に空白行もあります。

 ちなみにTEXTファイルで書き出すのをやめたのはやり方がわからなかったためです。
 (てつ)

 PCOMMから出てくるデータが
 タブ区切りだったりするのですか?

 タブ区切りになっていたら、TEXTにしたとしても
 エクセルに取り込んだ時に勝手に区切られてしまうと
 思うのですが。

 それに、現状でもわかれて貼りついてるって事です?

 >間に空白行もあります。
 なら、下から見ていくとか
 間の空白が一行しかないなら、もうひとつ下まで見るとか
 「多く見積もっても10行でしょ」と思えば10行分は見れば
 良いのではないでしょうか。

 また
 >あと行数の問題ですが、LOOPさせてるところで、行数が変わってしまうので・・・
 ここで行数をカウントしておけば、貼り付け先のセルを
 探す必要はなくなりそうです。

 ちなみに
[クリップボードの内容を取得する]
http://www.whitire.com/vbs/tips0170.html

 その他、[VBScript Tips]ページから
http://www.whitire.com/vbs/
・ファイルにデータを書き込む 
・ファイルに改行付きでデータを書き込む 
 等ありますのでご覧になってみられては?

 VBSはてつさんのご質問に答える事(このスレ)でしかやったことがありません。
 ですので、どうしても「VBAで何とかなる部分はVBAで」と
 思ってしまいます。
 やり方が分かっていれば、「何列かに分かれない方法」をとるのが
 真っ当だとは思いますが、たとえ「何列かに分かれた」としても
 次の処理(VBA)で、結合して使えば良いのではないかと思います。

 (HANA)


 明日HANAさんがいうエクセルにはるほうも再度挑戦します。
 私も一応WEBで探しているんですが・・・
 そうしてHANAさんはこうも簡単に探してこれるんだろうと思ってます。
 明日、明後日中にやってみて報告します。 ありがとうございます。
 (てつ)

 一応書いておきますが
  VBSでクリップボードの内容を取得
   VBSでテキストファイルに書き出す
 コードのあるページを知っていながら、
 エクセルに貼り付ける方法を提案したのは
 テスト時にこちらの方が簡単に成功したからです。

 コピー行数をカウントしておく事も
 ご検討ください。
 (貼り付け先のセルを探さなくて良くなるので)

 >TEXTファイルで書き出すのをやめたのはやり方がわからなかったためです。
 TEXTファイルに書き出すのはVBAのコードですから、自信を持って
        Print #1, ・・・・
 の様にすれば良いと思いましたが。
 「sFilePath」が ○○.txt だったら
 テキストファイルです。

 (HANA)

 こんばんわ 今日いろいろ試してみました。
 結果ですが、PCOMMのアウトプットをエクセルに直接張ろうとしましたが。。。
 やはりA列だけにはられる場合と、A列とB列にはられるてしまいます。
 B列にわたって張られる時に手作業で形式を選択して貼り付けのテキストとすれば
 うまいこといったのですが、PCOMMマクロにそのように記入できませんでした。
 何かいい方法はありますか?

 昨日の夜私が言ったどこのセルから張ればよいかというのは一画面が24行だったので
 A列のm*24+1行目にはるとすれば出来ました。
 xlSh2.Cells(24 * m + 1, 1).PasteSpecial

 HANAさんのいっていたエクセルからテキストに書き出すというのはやってませんが、
 PCOMM結果をエクセルに書き出すので書き出し先をその調べたいデータ一覧が
 入っているシートのSHEET2にするということでこれでいいかと思ってますが・・・^^
 (てつ)

 >手作業で形式を選択して貼り付けのテキスト
 を、VBSでの書き方は分かりません。

 >書き出し先をその調べたいデータ一覧が
 >入っているシートのSHEET2にする
 これが出来るなら、この方が良いと思います。

 (HANA)

 sub subSub1_()
   autECLSession.autECLOIA.WaitForAppAvailable
   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.SendKeys "[newline]"
   autECLMacro "[edit-paste]"

   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.SendKeys "[enter]"
   autECLSession.autECLOIA.WaitForInputReady
   autECLSession.autECLPS.WaitForAttrib 2,63,"00","3c",3,10000

   autECLSession.autECLPS.WaitForCursor 2,64,10000

   autECLSession.autECLOIA.WaitForAppAvailable
   autECLMacro "[edit-copy]"
 end sub

上記をエクセルで処理すると

 sub test ()
 Set SessObj = CreateObject("PCOMM.autECLSession") '←インスタント化
 SessObj.SetConnectionByName ("A") 'どのセッションにコマンドを送るか関連付け

 SessObj.autECLPS.SendKeys "[newline]", True
 SessObj.autECLOIA.WaitForInputReady
 SessObj.autECLPS.SendKeys "[enter], True

 SessObj.autECLOIA.WaitForInputReady
 SessObj.autECLPS.WaitForAttrib 2,63,"00","3c",3,10000

 SessObj.autECLPS.WaitForCursor 2,64,10000

 SessObj.autECLOIA.WaitForAppAvailable
 ' autECLMacro "[edit-copy]" '↓PCOMMに送信できないので代替処理
 画面データ = 画面配列'配列にセットし戻す

 Sheets(1).Select

 For i% = 1 To UBound(画面データ)
  cells(i%,1) =画面データ(i%)
 Next

 Set SessObj = Nothing
 End Sub

 Function 画面取得()
 Dim 画面_配列(1 to 24) ' 画面が24列なので
 Dim 画面取得_文字 As String
 Dim IntS, IntE As Integer
 Set autECLPSObj2 = CreateObject("PCOMM.autECLPS")
 Set mSess = CreateObject("PCOMM.autECLSession")
    mSess.SetConnectionByName ("A")
    autECLPSObj2.SetConnectionByName ("A")
    SessObj.autECLPS.Wait 500
    autECLPSObj2.autECLFieldList.Refresh
    画面取得_文字 = mSess.autECLPS.GetText()
 IntS = 1 '切取り文字スタート位置
 IntE = 80 '切り取る文字数
    For i = 1 To 24 '6〜20
        画面_配列(i) = MidMbcs(画面取得_文字, IntS, IntE)
        IntS = IntS + 80  '重要切取り文字位置カウントUP
    Next
 Set mSess = Nothing
 Set autECLPSObj2 = Nothing
 画面取得 = 画面_配列
 End Function

'VBAの文字の扱いがUnicodeの為すべての文字を2バイト文字処理するので半角空白とか1バイト文字も2バイトカウントされてしまい
'半角、全角混合する文字列での文字数にズレがでる。それを回避するために一度シフトJISに変化し処理を行っている

 Function MidMbcs(ByVal str As String, start, length)
    MidMbcs = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode)
 End Function
※IBMのサイトにマニュアルもまだあると思いますのでさがしてみたらどうでしょうか。

(通りすがり)


コメント返信:

[ 一覧(最新更新順) ]


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