dポイントプレゼントキャンペーン実施中!

エクセルからメモ帳にコピーすると、改行が” ”でくくられてしまうのですが、自動マクロで消したくて苦戦しています。エクセルからメモ帳を呼び出してエクセル文字をメモ帳にコピーするところまではできましたが、”を消去(置換する方法)がどうしてもわかりません。
誰か分かる方よろしくお願いいたします。

質問者からの補足コメント

  • 作成したマクロは以下のものです。*の置換部分を追加してもらえればと考えております。
    そんな単純なものではないのかもしれませんが、分かればお願いします。

    Sub 計画書()
    Dim ret As Long
    ActiveSheet.Range("BI4:CD21").Copy
    ret = Shell("Notepad.Exe", vbNormalFocus)
    AppActivate ("無題 - メモ帳")
    CreateObject("Wscript.Shell").SendKeys "^v"
     
     *この間に「””」→空 の置換 マクロを 追加したい (メモ帳上で操作したい)

      SendKeys "^A"
    SendKeys "^C"
    SendKeys "%{F4}"
    SendKeys "Light"
    SendKeys "Enter"

    End Sub

      補足日時:2018/02/11 08:40

A 回答 (3件)

こんにちは。



>(メモ帳上で操作したい)
かつて、Resource Hacker というツールで、構造を把握して、操作できましたが、Windows7 ぐらいからできなくなったと思います。少なくとも、私には、キーボードマクロのUWSCを操るならともかく、その問題は、何年掛かっても解決していません。

Excelが2003から2007に変わったと同様に、メモ帳の構造が変わったからだと思うのです。
貼り付け後に操作するのは、#1のコードよりも更に複雑になることは想像がつきます。もちろん、ショートカットキーを連続してできる見込みがあれば、やってみる価値はあると思います。

そこで、私が考えたのは、貼り付ける前に操作することです。
補足に載せられている
ActiveSheet.Range("BI4:CD21").Copy
この部分を、一旦、テキストに変えて、それを変数に入れて、その中で処理してから、クリップボードにいれればよいはずです。

  Const CLSID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
  Set CB = CreateObject("new:" & CLSID)
これは、Excelのクリップボードです。あまり応用力はありませんが、Text 処理ぐらいなら可能です。

ただ、もし、ここの質問を他の回答者が読めば、かならず指摘されるのは、メモ帳を立ち上げて貼り付けるという順番の問題です。ふつうは、そのようなことはせずに、テキスト出力をしてから、メモ帳で吸い上げるということをします。そのほうが遥かに安全で確実です。つまり、一度、テンポラリーファイルを置いて処理するということです。

#1でやっていることはそれほど難しいものではありませんが、私個人が、どうしても操作中にハンドルが外れる問題に、数年前に試行錯誤で作ったコードです。

それから、これは、WScript から行うものだとすれば、
With CreateObject("Wscript.Shell")
 .SendKeys "^A"
 .SendKeys "^C"
 .SendKeys "%{F4}"
 .SendKeys "{Light}"
 .SendKeys "{Enter}"
End With
になるはずです。しかし、保存が自動で行われるものでしたら、なおさら、
Excelで、CSVを出力するコードと同じように、Text を吐き出させるように作ったほうが楽だと思います。話しが見ええないようでしたら、サンプルを作ります。

VBAの中で、
  Open OutFileName For Output As #1
   Print #1,strLine '一旦、バッファに入れて、そこで処理して、Print(出力)させる
  Close #1

を使えばよいです。
    • good
    • 1
この回答へのお礼

とても参考になりました。 この文章を頼りに解決しました。

Sub 計画書()
Dim ret As Long
ActiveSheet.Range("BI4:CD21").Copy
ret = Shell("Notepad.Exe", vbNormalFocus)
AppActivate ("無題 - メモ帳")
CreateObject("Wscript.Shell").SendKeys "^v"
Application.SendKeys "%ER", True
SendKeys """"
SendKeys "{Tab 5}"
SendKeys "{Enter}"
SendKeys "{Esc}"
SendKeys "^a"
SendKeys "^c"
SendKeys "%{F4}"
SendKeys "{Tab}"
SendKeys "{Enter}"
End Sub

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

お礼日時:2018/02/11 12:29

> *この間に「””」→空 の置換 マクロを 追加したい (メモ帳上で操作したい)



この部分を素直に回答すると
SendKeys "%E"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{ENTER}"
SendKeys """"
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{ENTER}"
SendKeys "%{F4}"

なります。
ダブルクォートをメモ帳の置換機能で削除しています。
 ※Windows10のメモ帳ではこれで動作しました、他のWindowsのメモ帳ではもしかしたら
  ボタン等のレイアウトの違いからDOWNやTABの回数が異なるかもしれません。

ただ他の回答者様も仰られているように
わざわざメモ帳を開いて操作し、さらにコピーするという操作は普通行いません。
直接テキストファイルに出力すると思います。

メモ帳で編集してからクリップボードへコピーしたデータを最終的にどうしたいのかをご提示いただけば
もっとシンプルで確実な方法の回答がつくかもしれませんよ。
    • good
    • 1
この回答へのお礼

ありがとうございます。これで解決できました。
仕事上のことで””がつくとエラーになって送信できないとのことなので、これをとれる方法を考えていました。
文章足らず申し訳ありませんでした。
添付ファイルもテキストファイルになりますが、貼り付け作業は他部署の方が必要な個所へ行うことになっています。
しかし、これで解決できたので良かったです。本と考えて下さりありがとうございました。

お礼日時:2018/02/11 12:26

以下は、ご質問の解答とは違うかもしれませんが、「コピーするところまでできましたが……」では、実際、どんなコードなのかは分かりかねますので、結果的には最初から作ったほうが早いように感じました。



>エクセルからメモ帳にコピーする
今、試してみましたが、" " が入る様子はありませんね。どのようなコードか分かりませんが、サンプルを書いておきます。以下は、貼り付けの一般的なコードだと思います。
クリップボードも、Win APIという方法もありますが、簡易型にしてしまいました。倍以上のコードになるからです。ExcelのClipBoard オブジェクトは、あまりオン・オフを繰り返し使うとハングする可能性があります。

以下は、ActiveCell の文字を、メモ帳にぺーストするという内容です。

'//標準モジュール
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
''Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Const WM_PASTE As Long = &H302

Sub Notepad_Paste()
  Dim CB As Object
  Dim hWnd As Long
  Dim hWnd_c As Long
  Dim cnt As Long
  Const CLSID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
  Set CB = CreateObject("new:" & CLSID)
  If ActiveCell.Value = "" Then MsgBox "データが空です", vbExclamation: GoTo EndLine
  CB.SetText ActiveCell.Value
  CB.PutInClipboard
  hWnd = FindWindow("Notepad", vbNullString)
  If hWnd = 0 Then
    Shell "Notepad.exe", vbNormalNoFocus
  End If
  Do
    cnt = cnt + 1
    hWnd = FindWindow("Notepad", vbNullString)
    ' hWnd = GetForegroundWindow()  '現行では不要です。
    DoEvents
    hWnd_c = FindWindowEx(hWnd, 0&, "Edit", vbNullString)
  Loop Until hWnd > 0 And hWnd_c > 0 And cnt < 6
  Call SendMessage(hWnd_c, WM_PASTE, 0&, ByVal 0)
EndLine:
  Set CB = Nothing
End Sub
'//
なお、改行そのものを入れるのでしたら、
 If ActiveCell.Value .... の後に、
  buf = Replace(ActiveCell.Value, vbLf, vbCrLf)
  CB.SetText buf

として、クリップボードに入れてあげればよいです。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
また、親切に作成までしてくださりありがとうございます。
しかし、初心者のため、上記の内容が難しく理解できません。
作成したマクロは以下のものです。*の置換部分を追加してもらえればと考えております。
そんな単純なものではないのかもしれませんが、分かればお願いします。

Sub 計画書()
Dim ret As Long
ActiveSheet.Range("BI4:CD21").Copy
ret = Shell("Notepad.Exe", vbNormalFocus)
AppActivate ("無題 - メモ帳")
CreateObject("Wscript.Shell").SendKeys "^v"
 
 *この間に「””」→空 の置換 マクロを 追加したい (メモ帳上で操作したい)

  SendKeys "^A"
SendKeys "^C"
SendKeys "%{F4}"
SendKeys "Light"
SendKeys "Enter"

End Sub

お礼日時:2018/02/11 08:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています