Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1896 / 13645 ツリー ←次へ | 前へ→

【71149】エクセルデータをコピーしメモ帳立ち上げ貼り付ける 12/2/2(木) 16:56 質問[未読]
【71150】Re:エクセルデータをコピーしメモ帳立ち上... とおりすぎ 12/2/2(木) 17:25 回答[未読]
【71151】Re:エクセルデータをコピーしメモ帳立ち上... とおりすがりがり 12/2/2(木) 17:30 回答[未読]
【71152】Re:エクセルデータをコピーしメモ帳立ち上... 12/2/2(木) 17:34 質問[未読]
【71154】Re:エクセルデータをコピーしメモ帳立ち上... とおりすぎ 12/2/2(木) 17:45 回答[未読]
【71155】Re:エクセルデータをコピーしメモ帳立ち上... とおりすぎ 12/2/2(木) 17:58 回答[未読]
【71156】Re:エクセルデータをコピーしメモ帳立ち上... ちん 12/2/2(木) 18:08 発言[未読]
【71157】Re:エクセルデータをコピーしメモ帳立ち上... 12/2/2(木) 18:30 お礼[未読]
【71158】Re:エクセルデータをコピーしメモ帳立ち上... ちん 12/2/2(木) 22:53 発言[未読]
【71159】Re:エクセルデータをコピーしメモ帳立ち上... ちん 12/2/3(金) 0:36 発言[未読]
【71160】Re:エクセルデータをコピーしメモ帳立ち上... とおりすがりがり 12/2/3(金) 8:50 回答[未読]
【71161】Re:エクセルデータをコピーしメモ帳立ち上... ちん 12/2/3(金) 9:22 発言[未読]
【71165】Re:エクセルデータをコピーしメモ帳立ち上... ちん 12/2/3(金) 11:19 発言[未読]
【71174】Re:エクセルデータをコピーしメモ帳立ち上... Abyss 12/2/3(金) 16:41 発言[未読]

【71149】エクセルデータをコピーしメモ帳立ち上げ...
質問   E-MAIL  - 12/2/2(木) 16:56 -

引用なし
パスワード
   どうかご教授をお願いいたします。

Excelのデータを全画面コピーして、メモ帳を立ち上げ
そこに貼り付けをしたいのですが、貼り付けがうまくいきませんでした。

以下のコードの貼り付けの部分をどうしたら上手く貼れるでしょうか。


Sub コピー()
  Cells.Select
  Selection.Copy
  
a& = Shell("c:\windows\notepad.exe", 1)    'メモ帳を起動

  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    
End Sub

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

【71150】Re:エクセルデータをコピーしメモ帳立ち...
回答  とおりすぎ  - 12/2/2(木) 17:25 -

引用なし
パスワード
   メモ帳を立ち上げない方がはるかに簡単なのだが、どうしてもメモ帳が必要か?
必要なら、C言語とか勉強するように。

必要ないなら、Openステートメントとか、FileSystemObjectのTextStreamとか、
あるいはシートに記述した後、名前をつけて保存でtxtとして保存するとか。

【71151】Re:エクセルデータをコピーしメモ帳立ち...
回答  とおりすがりがり  - 12/2/2(木) 17:30 -

引用なし
パスワード
   >シートに記述した後、名前をつけて保存でtxtとして保存するとか。
目的のシートをそのまま名前をつけて保存で良いような。

【71152】Re:エクセルデータをコピーしメモ帳立ち...
質問   E-MAIL  - 12/2/2(木) 17:34 -

引用なし
パスワード
   ▼とおりすぎ さん:

ご回答ありがとうございます。

データは一時的に置きたいだけなので、保存はしなくていいのです。
テキストに貼った後に更にコピーをしてメールに貼り付けをしたいのです。

エクセルをそのままコピーするとメールの容量が重くなってしますため。

何か案がありましたらよろしくお願いいたします。


>メモ帳を立ち上げない方がはるかに簡単なのだが、どうしてもメモ帳が必要か?
>必要なら、C言語とか勉強するように。
>
>必要ないなら、Openステートメントとか、FileSystemObjectのTextStreamとか、
>あるいはシートに記述した後、名前をつけて保存でtxtとして保存するとか。

【71154】Re:エクセルデータをコピーしメモ帳立ち...
回答  とおりすぎ  - 12/2/2(木) 17:45 -

引用なし
パスワード
   保存したのをshellなどで立ち上げて、必要なくなったらKillすれば良いのでは。

【71155】Re:エクセルデータをコピーしメモ帳立ち...
回答  とおりすぎ  - 12/2/2(木) 17:58 -

引用なし
パスワード
   こんなの。
Sub CreateTxt()
 Const TxtPath As String = "D:\test\Hoge.txt" '適当なPath
 Dim wb As Workbook
 
 ActiveSheet.Copy
 Set wb = ActiveWorkbook
 wb.SaveAs TxtPath, xlUnicodeText
 wb.Close False
 Shell "NotePad.exe " & TxtPath
End Sub

Sub KillTxt()
 Const TxtPath As String = "D:\test\Hoge.txt" '上と同じPath
 Kill TxtPath
End Sub

KillTxtの法は、メモ帳閉じてから実効。

【71156】Re:エクセルデータをコピーしメモ帳立ち...
発言  ちん  - 12/2/2(木) 18:08 -

引用なし
パスワード
   ▼け さん:こんばんわ、ちんといいます。
皆様こんばんわ。
け さんのお使いの環境は?
OS、Excelバージョン、メールソフト

参考として、
1.Excelシートコピー -> メールへ添付
※メールの設定オプションで、HTML形式/テキスト形式があり、
テキスト形式にすると、添付したデータ容量は減ります。
2.Excelに電子メールという機能があります。OutLOOKと連携したもの?だと思いますが。それを使用すると、そのシートのみメールできます。
※1.と同様に、テキスト形式であれば、容量は減ります。
3.CSVファイルで別名で保存し、メールに添付するとか、
4.Excelを圧縮して、メールに添付するとか。
5.PDFやドキュワクスにして、メールするとか。

とりあえず、参考までに・・・

【71157】Re:エクセルデータをコピーしメモ帳立ち...
お礼   E-MAIL  - 12/2/2(木) 18:30 -

引用なし
パスワード
   ▼ちん さん:

ご回答ありがとうございます。

毎日メールの文章で報告しなければならない作業なので
元のエクセルのテキストをそのままシンプルに貼り付けたいのが目的でした。

エクセルをそのままコピーすると表までコピーされてしまうので
アウトルック側でテキストの貼り付けにすれば同じことではあるというのも
理解でします。

ありがとうございました。


>▼け さん:こんばんわ、ちんといいます。
>皆様こんばんわ。
>け さんのお使いの環境は?
>OS、Excelバージョン、メールソフト
>
>参考として、
>1.Excelシートコピー -> メールへ添付
>※メールの設定オプションで、HTML形式/テキスト形式があり、
>テキスト形式にすると、添付したデータ容量は減ります。
>2.Excelに電子メールという機能があります。OutLOOKと連携したもの?だと思いますが。それを使用すると、そのシートのみメールできます。
>※1.と同様に、テキスト形式であれば、容量は減ります。
>3.CSVファイルで別名で保存し、メールに添付するとか、
>4.Excelを圧縮して、メールに添付するとか。
>5.PDFやドキュワクスにして、メールするとか。
>
>とりあえず、参考までに・・・

【71158】Re:エクセルデータをコピーしメモ帳立ち...
発言  ちん  - 12/2/2(木) 22:53 -

引用なし
パスワード
   ▼け さん:こんばんわ、ちんといいます。
ExcelのVBAで、
普段使用されてるメールソフトがMicrosoft Outlookでしたら、
VBAでメールソフトを起動し、シートをコピーし、
テキスト文のみメールに貼り付け、送信する。で、どうでしょうか?
※Outlook Expressを使用していると、ソースが異なります。
Microsoft Outlookでのサンプルです。

Sub MAKE_MAIL_ITEM_TEST_NG()

  Dim oApp As Object
  Dim myNameSpace As Object
  Dim myFolder As Object

  Dim objMAIL As Object 'メールのオブジェクト
  Dim strMOJI As String '本文

  'outlook 起動
  Set oApp = CreateObject("Outlook.Application")

  Set myNameSpace = oApp.GetNamespace("MAPI")
  Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
  myFolder.Display '表示 いつものクセで .Visible = True とやりがちだけど

  Cells.Select  '*** シートのセル全て選択
  Selection.Copy '*** シートのコピー

  'メールアイテムの作成
  Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
  objMAIL.Display  '画面表示(Mail入力、編集画面を表示)

  '宛先・件名・本文 などのデータを代入する
  objMAIL.To = "******@yahoo.co.jp";;      '宛先 ほかに.cc や.Bccも可能です
  
  objMAIL.Subject = "テスト メールの件名です " '.Subjectに文字列設定で件名
  
  '本文を作る、(vbCrLfで改行されます)
  strMOJI = "こんにちは(このメールtest)"

  
  Dim buf As String, buf2 As String, CB As New DataObject
  buf = "tanaka"
  With CB
    .GetFromClipboard  ''クリップボードからDataObjectにデータを取得する
    buf2 = .GetText   ''DataObjectのデータを変数に取得する
  End With
''  MsgBox buf2
  objMAIL.Body = buf2         '※Excelのコピーしたものをテキスト文のみメールに貼り付け   
  Application.CutCopyMode = False  'クリップボード クリア

  objMAIL.Display  '編集画面のまま止めておきたい時 や テスト中に動作を見たいとき
  'objMAIL.Save  '保存、下書きへ 保存後、用が無かったら.Closeで閉じるのがいいのかなぁ。。。
  'objMAIL.Close 2 '閉じる Mailの編集画面を閉じる
  
  objMAIL.Send  '送信箱へ ※セキュリティの警告メッセージが出るよ
  
  'ここで、普通はオブジェクトの開放など、後始末をする。
  Set myFolder = Nothing
  Set myNameSpace = Nothing
  Set oApp = Nothing


End Sub

【71159】Re:エクセルデータをコピーしメモ帳立ち...
発言  ちん  - 12/2/3(金) 0:36 -

引用なし
パスワード
   ▼け さん:こんばんわ、ちんです。
Excelデータをコピーし、ノートパッドを起動。
ノートパッドの貼り付け -> すべて選択 -> コピー までの流れです。


Sub TestSendText()
  Dim ret As Long
  
  Cells.Select  '*** シートのセル全て選択
  Selection.Copy '*** シートのコピー

  ret = Shell("Notepad.Exe", vbNormalFocus)
  AppActivate ("無題 - メモ帳")
  
  '*** Excelからのデータをノートパッドへ貼り付け Ctrl+V
  CreateObject("Wscript.Shell").SendKeys "^v"
  
  '*** ノートパッドのすべてを選択 Ctrl+A
  CreateObject("Wscript.Shell").SendKeys "^a"
  
  '*** ノートパッドのコピー Ctrl+C
  CreateObject("Wscript.Shell").SendKeys "^c"
  
  
  '*** あとは、メール文書へ貼り付けしてください。
  
  
End Sub

以上、参考までに・・・

【71160】Re:エクセルデータをコピーしメモ帳立ち...
回答  とおりすがりがり  - 12/2/3(金) 8:50 -

引用なし
パスワード
   SendkeysはVBAもWSHShellもバグがあるから、使わないほうが良いよ。
そもそもバグが無くても毎回きちんと動作するとは限らないし。

【71161】Re:エクセルデータをコピーしメモ帳立ち...
発言  ちん  - 12/2/3(金) 9:22 -

引用なし
パスワード
   ▼とおりすがりがり さん、おはようございます。ちんです。
>SendkeysはVBAもWSHShellもバグがあるから、使わないほうが良いよ。
>そもそもバグが無くても毎回きちんと動作するとは限らないし。

検証はしたんですが、何度も使用しているとどうなるか?
そうなんですよね、フォーカスが違うとこをさすと、そうなりますよね!

APIを使用すれば、解決の道はあるのでしょうが、APIで調べてみますね。

【71165】Re:エクセルデータをコピーしメモ帳立ち...
発言  ちん  - 12/2/3(金) 11:19 -

引用なし
パスワード
   ▼け さん:こんにちわ、ちんです。
APIを使用すると、こんな形です。

Option Explicit
'クラス名、キャプションから子ウィンドウのハンドルを取得
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
'引数
' hwndParent:子ウィンドウを見つけるときの親ウィンドウのハンドル
'   (デスクトップを親ウィンドウとするとき0)
' hwndChildAfter:検索を開始する子ウィンドウのハンドル
'   0 を設定したとき、hwndParentの最初の子ウィンドウから検索する
' lpszClass:クラス名
' lpszWindow:ウィンドウのキャプション(タイトル)
'
'戻り値
' 正常終了のとき ウィンドウのハンドル、エラーのとき 0
'
'FindWindow()関数との違いは子ウィンドウか検索できること。
'hwndParentとhwndChildAfterが共に0のときトップレベルウィンドウが検索対象。

' ウィンドウにメッセージを送る関数の宣言
Public Declare Function SendMessage Lib "user32.dll" _
  Alias "SendMessageA" _
  (ByVal hWnd As Long, _
  ByVal Msg As Long, _
  ByVal wParam As Long, _
  lParam As Any) 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_IME_CHAR = &H286  '文字コード送信
Public Const WM_SETTEXT = &HC    '文字列送信
Private Const WM_COPY = &H301    'コピー (P837)
Private Const WM_CUT = &H300    '切り取り(P840)
Private Const WM_PASTE = &H302   '貼り付け(P876)
Private Const WM_UNDO = &H304    '元に戻す(P892)

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 strDtSrc As String
  Dim strDt As String

  
  Dim lngDt As Long
  Dim i As Long
  
  Cells.Select  '*** シートのセル全て選択
  Selection.Copy '*** シートのコピー
  
  '*** Excelシートのデータをメモ帳へ貼り付け Ctrl+V
  lngRc = SendMessage(lnghWndTarget, WM_PASTE, 0, 0)
    
End Sub

ただし、メモ帳の「すべて選択」 のあり方がまったく解りません。
貼り付けまでは、できます。
以上、参考までに・・・

【71174】Re:エクセルデータをコピーしメモ帳立ち...
発言  Abyss  - 12/2/3(金) 16:41 -

引用なし
パスワード
   > ただし、メモ帳の「すべて選択」 のあり方がまったく解りません。

WM_COMMANDメッセージを送る方法があります。(メニューIDを25で)

1896 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free