[[20150613234613]] 『VBSからエクセルを起動してクリップボード内容取刀x(田吾作) ページの最後に飛ぶ

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

 

『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.