[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBSからエクセルを起動してクリップボード内容取得,クリップボード再格納』(田吾作)
またまたおかしなことを始めました。
VBSからエクセルオブジェクトを生成し、シート上にテキストボックスを配置し、 テキストボックスにクリップボード内容を貼り付け、テキストボックス内容を編集、 テキストボックス内容をコピーしクリップボードに再格納、という作業です。
コード中の★のところまではうまくいってるようですが、テキストボックス内容を コピー、というところが実行されないようです。 実行されない、というより、長さ0の文字列がコピーされてるようで、クリップボード 内容がクリアされてしまうのです。実行結果を手動で新規メモ帳に貼り付けようとし ても何も貼り付きません。
どのように書き換えたらいいでしょうか、ご教示お願いいたします。
dim xl dim wb Dim mytb Dim ws dim mae dim ato Set xl=CreateObject("Excel.Application") xl.Visible =True Set wb =xl.Workbooks.Add Set ws = wb.worksheets(1) Set mytb = ws.OLEObjects.Add("Forms.TextBox.1", "", False, False, "", 0, "", 0, 1, 1) With ws.OLEObjects(mytb.Name).Object '.height = 100 '.width=400 .MultiLine = True .Paste mae = .Value .Value = "" ato = mae & VbCrlf & "hoge" .Value = ato .Selstart = 0 .SelLength = Len(.Value) MsgBox .SelText '★ここまではうまくいってるようです .Copy End With mytb.Delete wb.saved = true wb.close xl.quit Set mytb = Nothing Set ws = Nothing Set wb = Nothing set xl=Nothing Wscript.Quit
< 使用 Excel:Excel2007、使用 OS:WindowsVista >
クリップボードが "" になってしまうのは、まだ、わかりません。 というか、環境をつくって、このまま動かすと、こちらでは VBS そのものが、どさっと消えて一部だけになってしまいます。
それはともあれ、
シートに TextBox1 を配置し、そこに、たとえば "abcd" と入力しておきます。 で、シートモジュールに以下を書いて、このマクロを実行します。
そのあと、シート上で任意のセルを選択して Ctrl/v 。 ペーストされるのは、"abcd" という文字列ではないですよね?
Sub Test() With TextBox1 .SelStart = 0 .SelLength = .TextLength .Copy End With End Sub
ところで、「おかしなことをはじめた」といわれていますが、この目的は?
(β) 2015/06/14(日) 06:12
ためしてみました。 「このアクションを実行するとプロジェクトがリセットされます。 実行しますか?」の警告が出ます。 この段階ではすでにクリップボードはクリアーされているようです。
ちょっと原因はわかりません。
--------------------------------------------------- VBSを使わずに以下を実行すると、まともに動きます。 所期する、文字列が追加されたものがクリップボードから得られます。
Sub test2() Dim wb As Workbook Dim ws As Worksheet Dim mytb Dim mae Dim ato
Set wb = Workbooks.Add Set ws = wb.Worksheets(1) Set mytb = ws.OLEObjects.Add("Forms.TextBox.1", "", False, False, "", 0, "", 0, 1, 1) With ws.OLEObjects(mytb.Name).Object '.height = 100 '.width=400 .MultiLine = True .Paste mae = .Value .Value = "" ato = mae & vbCrLf & "hoge" .Value = ato .SelStart = 0 .SelLength = Len(.Value) MsgBox .SelText .Copy End With mytb.Delete wb.Saved = True wb.Close End Sub
VBSから実行するときには、セキュリティ関連のなんらかのチェックがかかるのでしょうか。 その解明に興味があるならいざしらず、普通にExcelを使ったらどうでしょうか。
(γ) 2015/06/14(日) 07:04
>実行結果を手動で新規メモ帳に貼り付けようとし ても何も貼り付きません。
Excel2010&Win7で試した結果です。
まず、田吾作さんが提示されたVBSコードを実行した結果ですが、コピーはされていました。
が、本来 テキストボックスに入力されている Valueプロパティの内容がコピーされているはずなのですが、
コピーされているのはテキストボックスオブジェクトそのものでした。
よって、メモ帳では、貼付け可能にはなりません。
色々試してみましたが、Copyメソッドの代わりにSendkeysで"^c"を送ったり、コピー関連の処理だけ Excelブックに記述し、そのプロシジャーをVBSから呼び出す方法だと 正しくテキストボックスの中身の文字列がコピーされます。
ActiveXコントロールのDataObjectを使って、クリップボード周りを操作する方法等もあります。
何らかの理由でどうしてもテキストボックスを使いたいなら、上述のDataobjectとテキストボックスを
連携させる方法も考えられます。
以下に示すコードは、ExcelシートにActiveXControlのフレームを配置し、そのフレーム内にテキストボックスを配置して、テキストボックスの内容をコピーするVBSコード例です。
dim xl
dim wb
Dim myf
Dim ws
dim mae
dim ato
Set xl=CreateObject("Excel.Application")
xl.Visible =True
Set wb =xl.Workbooks.Add
Set ws = wb.worksheets(1)
set myf=ws.OLEObjects.Add("Forms.Frame.1", "", False, False, "", 0, "", 0, 1, 1)
myf.left=0
myf.top=0
myf.width=100
myf.height=50
With myf.Object.Controls.Add("Forms.TextBox.1")
.Left = 0 .Top = 0 .Width = 50 .Height = 20 .MultiLine = True .Paste mae = .Value '.Value = "" ato = mae & VbCrlf & "hoge" .Value = ato .Selstart = 0 .SelLength = Len(.text) .copy end with myf.Delete wb.saved = true wb.close xl.quit Set mytb = Nothing Set ws = Nothing Set wb = Nothing set xl=Nothing wscript.Quit
これだと正常に動作しました。
(ichinose@甘々娘食べ過ぎて動けない ) 2015/06/14(日) 14:31
βさん、γさん、ichinoseさん、αさん、ご回答ありがとうございます。
>ところで、「おかしなことをはじめた」といわれていますが、この目的は?
VBSからちょいとエクセルの機能を使いたいときがありますので、その勉強の ため、という点もあります。 エクセルだとNew DataObjectを使用しクリップボードの内容を取得したりク リップボードに格納したりできますが、VBSからは直接は制御できないので VBSから直接エクセルを制御する方法を探していました。
初めからエクセルでシートにテキストボックスを配置し、標準モジュールから 制御するようにすればVBSから呼び出して使うことができるのですが、それだと 前もってブックを保存したりしておく必要が出てきます。 頻繁に使うものでしたらこれでもOKですが・・・。
本格的にエクセルで処理するほどでもないが、かと言ってVBS単体では機能が 不足している、という処理です。 クリップボードの取得、格納、データのソートなどなど。
あと、昔、エクセル2002、IE7?の時にVBSからIEを起動してクリップボード 内容を取得したり格納したりするコードを使ってました。 ただ、これはやたらと時間がかかってましたのでほとんど使ってませんでした。
コードは↓です。
Dim IE Dim str Dim newstr Set IE = CreateObject("InternetExplorer.Application") str = cbget If str <> "" Then str = Str & VbCrlf newstr =str & "hoge" Call cbset(newstr) IE.Quit Set IE = Nothing Wscript.Quit
Function cbget() IE.Navigate ("about:blank") cbget = IE.document.parentwindow.clipboardData.GetData("text") If IsNull(cbget) = True Then cbget = "" End Function
Function cbset(byval newcbstr) IE.Document.ParentWindow.ClipboardData.ClearData "text" IE.Document.ParentWindow.ClipboardData.SetData "text",newcbstr End Function
今日、久々に使ってみたら、パソコンの環境が変わったせいか、瞬時とまで は行きませんが、以前とは比較にならないほど処理が速くなってました。
ほかには、いったんシートに貼り付けてセルのデータを編集する、というの も試しました。 全てのセルの書式を文字列型にしておいて貼り付けました。 そしてUsedRangeに対して処理しました。 これも試行錯誤中です。
ichinoseさんのコードも試行させていただきうまく作動しました。 テキストボックス自体がクリップボードに格納されていたんですね。気づき ませんでした。
IEでの方法、テキストボックスを使った方法、シートに転記する方法、いろ いろ場面によって使い分けていこうと思います。
ありがとうございました。 (田吾作) 2015/06/15(月) 00:50
dataobjectがVBSでは生成できないとは思っていませんでした。 Createobject("new:xxxx")が、VBA上で確認して、VBSでもOKだと思い違いをしていました。失礼しました。
(ichinose) 2015/06/15(月) 06:27
田吾作さんが質問として提示されたコードや
βさんの
>ペーストされるのは、"abcd" という文字列ではないですよね?
やγさんの
> VBSから実行するときには、セキュリティ関連のなんらかのチェックがかかる
等の記述に加えて 田吾作さんの最後の投稿から 一度投稿しましたコード
Dim d Dim a Set d = CreateObject("htmlfile") a = d.ParentWindow.ClipboardData.GetData("text") a = a & " ok" msgbox a d.ParentWindow.ClipboardData.ClearData "text" call d.ParentWindow.ClipboardData.SetData("text", a)
これだと クリップボードからデータを取得は出来ても 登録は出来ない事実などから、
セキュリティ上止めている処理を投稿して良いのか? ということで一度削除しましたが、
そんな大げさなものではないと 判断し、再投稿しておきました。
βさんの Sub Test() With TextBox1 .SelStart = 0 .SelLength = .TextLength .Copy End With End Sub
.Copyを .object.copy とすると、文字列がコピーされます。
同じように VBS側からも同様に .object.copy とすれば、文字列コピーが可能になります。
Activexではなく、Excelの図形のテキストボックスを使えば コピー出来ますしねえ。
不可解な点はありますが、デキュリティ上ではないという判断から、 又仮にセキュリティ上だとしたら、甘い施しだという事も含めて投稿しました。 (ichinose) 2015/06/17(水) 07:04
To ichinoseさん
今まで、TextBox.Object という存在を知りませんでしたので。のぞいたこともなかったんですが テキストをラッピングした(?)オブジェクトで、そのValue がテキストそのものなんですね。
メモメモ。勉強になりました。
(β) 2015/06/17(水) 07:36
返事が遅れました。
>.Copyを .object.copy とすると、文字列がコピーされます。
確認できました。 もっと勉強が必要だということを痛感しました。 今後ともよろしくお願いします。 (田吾作) 2015/06/22(月) 00:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.