[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コピー選択の解除方法について』(You∞uoY)
はじめまして。
いつもこちらのサイトを参考にさせていただいています。
今回、OSを変えたところ、
今まで使えていたマクロが使えなくなり困っています。
<以前の環境>
WindowsXP
Excel2007
<現在の環境>
Windows7
Excel2007
《質問内容》
<以前の環境>で以下のマクロを利用していました。
' テキストCopy_登録用 Macro
'
Dim taskID As Double Dim copyRange As Range
taskID = Shell("Notepad.exe", vbNormalFocus) Range("M8:M15").Copy
AppActivate taskID SendKeys "^v", True
Application.CutCopyMode = False Range("M7").Select
End Sub
上記マクロを<現在の環境>で実行すると、
まっさらなNotepadが起動するだけになりました。
(テキストが貼りついていない状態?)
いろいろ試した結果、『Application.CutCopyMode = False』を削除することで
テキスト出力できるようになりましたが、
コピーした範囲を解除することができません。
ちなみに、まだ試行錯誤している状況で
現在は以下のマクロに変更して悩んでいます。
' テキストCopy_登録用 Macro
'
Dim rc As Long Dim copyRange As Range
Range("M8:M15").Copy rc = Shell("notepad.exe", vbNormalFocus)
If rc <> 0 Then Application.SendKeys "%EP", True Else MsgBox "起動に失敗しました" End If
End Sub
しかし、上記のマクロにも
『Application.CutCopyMode = False』を入れると同じ現象が起きます。
ちなみに、別のマクロでは『Application.CutCopyMode = False』は
普通に利用できています。
[参考]※利用可能なマクロ
Sub 開始値特定()
ActiveSheet.Next.Activate Range("H9:I9").Select Selection.Copy ActiveSheet.Previous.Activate Range("B10").PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False
End Sub
別のアプリケーションへの貼り付けが問題なのかと思っていますが、
どこをどうすればよいのかさっぱりわからないため、
『テキストCopy_登録用 Macro』でコピー選択を解除する方法について
ご教示いただけると幸いです。
DoEvents とか Application.Wait (Now + TimeValue("00:00:01"))
横から失礼します。
API関数を使っても出来ます。 VB用コードですが、VBAにも転用できます。
VBパーツ 他アプリへの文字入力1
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendmessage/
↑は指定の文字列をメモ帳へ書き出してますが、特定のセル範囲を吐き出してやる場合は メモ帳へ吐き出すデータはクリップボードを経由させると簡単です。
クリップボードへの格納は↓が参考になると思います。
[[20121124162818]] 『「あああ」という文字をコピーモードにするには』
(カリーニン)
>クリップボードへの格納は↓が参考になると思います。
クリップボードの取得は、の間違いでした。失礼しました。
(カリーニン)
ご返信ありがとうございます。
これから試してみたいと思います!
結果は後程ご報告しますね!
(You∞uoY)
ご回答いただいた内容を確認し先ほど試してみました。
結果・・・
『DoEvents』では改善しませんでしたが、
『Application.Wait (Now + TimeValue("00:00:01"))』で改善しました。
> カリーニンさん
教えていただいた『API関数』を使う方法ですが、
私のスキル不足で、今の状態にどのように組み込んだらよいのか・・・
せっかく教えていただいたのに、すみません。
もう少し、レベルを上げてから試してみたいと思います。
お二人とも本当にありがとうございました!!
(You∞uoY)
必要と思われる部分のみ、ただ切り貼りしただけです。
Option Explicit
' 指定時間Wait(ミリ秒) Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'クラス名、キャプションから子ウィンドウのハンドルを取得 Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _ (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, ByVal lpWindowName As String) As Long
' ウィンドウにメッセージを送る関数の宣言 Public Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hWnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long
Public Const WM_SETTEXT = &HC '文字列送信
Sub test() Dim lnghWnd As Long 'トップレベル(親)のウィンドウハンドル Dim lnghWndTarget As Long 'ターゲット(子)のウィンドウハンドル Dim lngRc As Long 'APIの返却値
'------------------------------------- ' メモ帳を起動 '------------------------------------- lngRc = Shell(Environ("WINDIR") & "\NOTEPAD.EXE", vbNormalFocus) '起動 Sleep 100 '0.1秒待つ(起動完了)
'------------------------------------- ' ターゲットウィンドウのハンドルを取得 '------------------------------------- lnghWnd = FindWindowEx(0, 0, "Notepad", "無題 - メモ帳") '「メモ帳」のウィンドウハンドル lnghWndTarget = FindWindowEx(lnghWnd, 0, "Edit", "") '子ウィンドウのEdit
'------------------------------------- ' クリップボード経由で文字列を取得 '------------------------------------- Dim myStr As String
Range("M8:M15").Copy With New DataObject .GetFromClipboard myStr = .GetText End With Application.CutCopyMode = False
'------------------------------------- ' 送信 '------------------------------------- Dim strDtSrc As String
strDtSrc = myStr lngRc = SendMessageAny(lnghWndTarget, WM_SETTEXT, 0, ByVal strDtSrc)
End Sub
お返事遅くなって済みません。。。
マクロも記載していただき大変感謝です!
自分の勉強も兼ねて試してみたいと思います!
本当にありがとうございました。
(You∞uoY)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.