No.2
- 回答日時:
>スペースを区切り文字(連続した区切り文字は1文字として扱う)
今のところ、区切り文字は、スペース(半角・全角)になっています。
区切りは、Split を使っています。複合的な区切りなどの場合は、
正規表現Split (BRegExp) を使ったほうがよいでしょうね。
これは、ショートカットをつけると便利だと思います。
'//
Sub OutputfmrClipboard()
Dim CB As Object
Dim buf As Variant
Dim arbuf As Variant
Dim i As Long, j As Long, k As Long, n As Long
Const CLSID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
Set CB = CreateObject("new:" & CLSID)
On Error GoTo ErrHandler
With CB
.GetFromClipboard
buf = .GetText
If VarType(buf) = vbString Then
buf = Replace(buf, Space(1), Space(1), , , vbTextCompare)
Do
buf = Replace(buf, Space(2), Space(1), , , vbTextCompare)
Loop Until InStr(buf, Space(2)) = 0
arbuf = Split(buf, Space(1))
j = UBound(arbuf)
If j > -1 Then
For k = 0 To Int(j / 4)
For i = 0 To 3
ActiveCell.Offset(k, i).Value = Application.Clean(arbuf(n))
n = n + 1
If n > j Then Exit For
Next i
Next k
Else
ActiveCell.Value = Trim(arbuf)
End If
End If
End With
ErrHandler:
Set CB = Nothing
If Err() <> 0 Then
MsgBox Err.Number & " :" & Err.Description
End If
End Sub
'//
とりあえず試してみてください。おかしな部分があるかもしれません。以前、同様の回答で、不満を感じる人がいたようですが、これ以上のもの(様々なフォーマットを扱うクリップボード)を望まれると、掲示板の域を超えてしまうことになると思います。
上記でClean 関数を使っています。理由は、なぜか改行コードあたりが紛れ込むようです。
簡単に行うなら、区切り位置を利用して、ダミーを使って覚えさせれば、同じようなことが可能です。
素晴らしいです。素早い回答もうれしかったです。
ただ、私の説明が悪かったですね。
テキストに改行があったとき次の行の1列目から貼り付けたいのです。
「あい(スペース)うえお(スペース)(スペース) かきく(スペース) けこ(改行)
さし(スペース)すせそ(改行)
た(スペース)な」
の場合は 、A1「あい」 B1「うえお」 C1「かきく」 D1「けこ」
A2「さし」B2「すせそ」
A3「た」B3「な」
といった具合です。
No.3
- 回答日時:
こんなのはいかがですか?
----------------------------------------------------------------------
Sub Sample()
Dim ClipBoard As Variant
Dim RowNo As Long
Dim ColNo As Long
Dim StrNo As Long
Dim StrLen As Long
Dim StrVar As String
Dim StrCell As String
ClipBoard = Application.ClipboardFormats
If ClipBoard(1) = xlClipboardFormatText Then
ActiveSheet.Paste Destination:=Range("A1")
For RowNo = 1 To Cells(Rows.Count, 1).End(xlUp).Row
StrVar = Cells(RowNo, 1).Value
StrLen = Len(StrVar)
StrNo = 1
ColNo = 1
StrCell = ""
Do While StrNo <= StrLen
Select Case Mid(StrVar, StrNo, 1)
Case " "
If Mid(StrVar, StrNo + 1, 1) = " " Then
StrCell = StrCell & " "
StrNo = StrNo + 1
Else
Cells(RowNo, ColNo).Value = StrCell
StrCell = ""
ColNo = ColNo + 1
End If
Case Else
StrCell = StrCell & Mid(StrVar, StrNo, 1)
End Select
StrNo = StrNo + 1
Loop
If StrNo > StrLen Then Cells(RowNo, ColNo).Value = StrCell
Next
End If
End Sub
----------------------------------------------------------------------
区切り文字は、半角スペースのみですが、以下の「" "」(3箇所)を変更したものを追加していけば増やせます。
----------------------------------------------------------------------
Case " "
If Mid(StrVar, StrNo + 1, 1) = " " Then
StrCell = StrCell & " "
StrNo = StrNo + 1
Else
Cells(RowNo, ColNo).Value = StrCell
StrCell = ""
ColNo = ColNo + 1
End If
----------------------------------------------------------------------
どうもありがとうございます!取りあえず動かしてみましたが、想定に近い動作をしてくれました。
唯一の問題はスペースが連続したときに区切りも連続して入ってしまう(?)点です。これはWindFaller様の回答を参考に修正できるのかなと拝察しましたので、修正に努めてみます。
No.4
- 回答日時:
#3さんの「Application.ClipboardFormats」は知らなかったです。
ヘルプで調べました。Excel2007以上にあるものなのですね。
#2で書いた
》これ以上のもの(様々なフォーマットを扱うクリップボード)を望まれると、
》掲示板の域を超えてしまうことになると思います。
という発言は撤回させていただきます。すみませんでした。
これは、Win32 APIを想定したものです。いままで、APIで使っていたものは、今後は、そちらに切り替えてみようと思います。
また、ひとつ勉強になりました。
なお、これは、
Const CLSID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
RegSeeker とOLEVIEWで、調べられます。(両方共フリーな上に、かなり役に立つツールです。)
No.5
- 回答日時:
No.3「この回答へのお礼」について
あれ?スペースが2文字続いたときはスペース1文字にして区切らないのではないのでしょうか?詳しく説明いただけないでしょうか?
No.4 WindFallerさんへ
参照設定すれば Excel2003 等でも使えます。
リストに「Microsoft Forms 2.0 Object Library」が有ればチェックを入れます。
無ければ「C:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を指定します。
「あい(スペース)うえお(スペース)(スペース) かきく(スペース) けこ(改行)
さし(スペース)すせそ(改行)
た(スペース)(スペース)(スペース)な」
の場合は 、A1「あい」 B1「うえお」 C1「かきく」 D1「けこ」
A2「さし」B2「すせそ」
A3「た」B3「な」
といった動作を望んでいます。
pdfからコピーしたテキスト(表の形)をexcelに単純にペーストすると、A列に行すべてのテキストが貼り付けられたり、環境により列ごとに区切られることもあるのですが、意図しない空白セルが入ったりしています。
今は貼り付け後にテキスト ファイル ウィザードで、
区切り文字→スペース
連続した区切り文字は1文字として扱うにチェック
と設定しているのですが、この動作をマクロ化し、他のマクロと組み合わせたいと思っています。
No.6
- 回答日時:
もしかしたらスペースは何文字続いても1つの区切り文字として扱うと言うことですか?それならば以下のようなものでいかがでしょうか?
----------------------------------------------------------------------
Sub Sample2()
Dim ClipBoard As Variant
Dim RowNo As Long
Dim ColNo As Long
Dim StrNo As Long
Dim StrLen As Long
Dim StrVar As String
Dim StrCell As String
ClipBoard = Application.ClipboardFormats
If ClipBoard(1) = xlClipboardFormatText Then
ActiveSheet.Paste Destination:=Range("A1")
For RowNo = 1 To Cells(Rows.Count, 1).End(xlUp).Row
StrVar = Cells(RowNo, 1).Value
StrLen = Len(StrVar)
StrNo = 1
ColNo = 1
StrCell = ""
Do While StrNo <= StrLen
Select Case Mid(StrVar, StrNo, 1)
Case " "
If Mid(StrVar, StrNo + 1, 1) <> " " Then
Cells(RowNo, ColNo).Value = StrCell
StrCell = ""
End If
StrNo = StrNo + 1
Case Else
StrCell = StrCell & Mid(StrVar, StrNo, 1)
End Select
StrNo = StrNo + 1
Loop
If StrNo > StrLen Then Cells(RowNo, ColNo).Value = StrCell
Next
End If
End Sub
----------------------------------------------------------------------
これだとスペース文字を残すことが出来ませんが良いのでしょうか?
No.7
- 回答日時:
No.6 訂正です。
違う行を削除してしまいました。
----------------------------------------------------------------------
Sub Sample2()
Dim ClipBoard As Variant
Dim RowNo As Long
Dim ColNo As Long
Dim StrNo As Long
Dim StrLen As Long
Dim StrVar As String
Dim StrCell As String
ClipBoard = Application.ClipboardFormats
If ClipBoard(1) = xlClipboardFormatText Then
ActiveSheet.Paste Destination:=Range("A1")
For RowNo = 1 To Cells(Rows.Count, 1).End(xlUp).Row
StrVar = Cells(RowNo, 1).Value
StrLen = Len(StrVar)
StrNo = 1
ColNo = 1
StrCell = ""
Do While StrNo <= StrLen
Select Case Mid(StrVar, StrNo, 1)
Case " "
If Mid(StrVar, StrNo + 1, 1) <> " " Then
Cells(RowNo, ColNo).Value = StrCell
StrCell = ""
ColNo = ColNo + 1
End If
Case Else
StrCell = StrCell & Mid(StrVar, StrNo, 1)
End Select
StrNo = StrNo + 1
Loop
If StrNo > StrLen Then Cells(RowNo, ColNo).Value = StrCell
Next
End If
End Sub
----------------------------------------------------------------------
コードの内容は理解できていないのですが…
動作だけみると、普通にペーストしたときとマクロでペーストしたときで結果に違いがありません…。
No.8ベストアンサー
- 回答日時:
こんなので、どうかな
'
'メモ帳の複数行をコピーする。
'
Sub クリップボードにあるテキストデータをスペースを区切り文字()
Dim objClip As Object
Dim pData As String
'クリップボードのセット
Set objClip = GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
With objClip
.GetFromClipboard
pData = WorksheetFunction.Trim(.GetText)
pData = Replace(pData, " ", Chr(9))
Application.CutCopyMode = False
End With
Set objClip = GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
With objClip
.SetText pData
.PutInClipboard
End With
Cells(1, "A").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
素晴らしいです!
(細かいところまではチェックしきれていませんが)完璧に望み通りの結果が得られています。
どうもありがとうございました。
No.9
- 回答日時:
こんにちは。
#2の回答者です。
改良型と言いたいのですが、あまり複雑になると、やはりダイアログにしたほうが良いようです。ここのテキストファイルウィザードと同じようなものは私も作れるのですが、マクロの意味がなくなってしまいます。また、テキストファイルウィザードそのものを利用しても作れるのですが、一定以上のスキルがあるという自負があると、なかなかお仕着せのものは使いづらいです。記録マクロを応用すれば、簡単に出来上がります。(出てきたコードに、最後にQueryTables(1).Delete だったかな、それを加えれば、完璧のはずです)
テキストファイルウィザードの設定は、複数を使うことが可能ですが、その場合は、私は、BRegExp.dll/Basp21 というツール(公に認められています)を使います。
現状では、スペース区切りと他の区切り文字とは、多数は共存はできませんが、区切り文字を「、(読点)」「, (カンマ)」などの文字列とした場合も区切れるようにしました。安易ですが、スペースに変えるわけです。
また、Windowsの場合は、Chr(13) =CR を使って区切ってしまうと、Chr(10)=LFが、次の行の文字列に残ってしまうようですので、予め、削除することにしました。
Excelでは、数式などは、'=AB1' だと文字に入りませんので、それも加えました。ただ、経験値を活かしても、せいぜい、こんなものです。単純明快なコードのほうが最近は好まれるようですが……。
'//
Sub OutputfmrClipboardR()
Dim CB As Object
Dim buf As Variant, ea As Variant
Dim arBufs As Variant
Dim arBuf As Variant
Dim stc As Variant
Dim i As Long, j As Long, k As Long
Const CLSID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
Set CB = CreateObject("new:" & CLSID)
'Const DELIM As String = "、" '文字を区切り文字を使う場合(下も外す)
On Error GoTo ErrHandler
Range("A1").Select 'A1 を最初とする
With CB
.GetFromClipboard
buf = .GetText
If VarType(buf) = vbString Then
'buf = Replace(buf, DELIM, Space(1), , , vbTextCompare) ''区切り文字を使う場合
arBufs = Split(buf, Chr(13), , vbBinaryCompare)
For Each stc In arBufs
If Len(stc) > 0 Then
'全角空白を半角に
buf = Replace(stc, Space(1), Space(1), , , vbTextCompare)
'空白は2個以上は、1つにまとめる
Do
buf = Replace(buf, Space(2), Space(1), , , vbTextCompare)
Loop Until InStr(buf, Space(2)) = 0
'Windows用 不要な改行コードを落とす
buf = Replace(buf, Chr(10), "", , , vbBinaryCompare)
arBuf = Split(buf, Space(1))
j = UBound(arBuf)
If j > -1 Then
For i = 0 To j
'Excelでは、セルの文頭に使えない文字がある
If arBuf(i) Like "[-+=]*" Then
ea = "'" & arBuf(i)
Else
ea = arBuf(i)
End If
'不要なバイナリコードをセルには入れない。
ActiveCell.Offset(k, i).Value = Application.Clean(Trim(ea))
Next i
End If
k = k + 1
End If
Next stc
End If
End With
ErrHandler:
Set CB = Nothing
If Err() <> 0 Then
MsgBox Err.Number & " :" & Err.Description
End If
End Sub
'//
GooUserラック様へ。
ありがとうこざいました。これで終止符を打てると思ってClipboardFormats を使おうと思いましたが、取り出すほうは、また関数が用意されていないようです。ここで、取り出すAPI関数を使おうとも考えてみましたが、ちょっと大げさ過ぎてしまいますので、やめにしました。
私は、長い間、この件は、いろんな方法を試してみて、し尽くしているつもりですから、当然、「Microsoft Forms 2.0 Object Library」の参照設定は知っているのですが、なかなか容易には使わせてもらえないような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでPowerPointからExcelにレイアウト通りに出力する 4 2023/07/05 12:22
- Excel(エクセル) Excelに文字データのみを貼り付けたい 8 2023/05/03 15:38
- その他(Microsoft Office) Excelの条件付き書式についての質問です。 2 2022/09/08 01:25
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) VBAマクロ 決まっていない行を選択して別シートへ貼付け 4 2023/02/16 16:08
- Visual Basic(VBA) VBA B列にある前から10文字のみ表示 3 2023/08/07 11:24
- Word(ワード) 写真3枚をA4に貼り付けたい 5 2023/07/03 14:36
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) Excelについて教えてください。 帳票データがあります。 アクセスに取り込むため、 データ形式にし 1 2022/06/08 19:59
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
EXCELのマクロを使って、テキストファイル(タブ区切り)の行列の一部
その他(Microsoft Office)
-
VBAマクロ実行時エラーの修正について
Visual Basic(VBA)
-
-
4
【VBA】エクセルで選択した範囲の値のみをクリップボードにコピーするコードについて
Excel(エクセル)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
7
エクセルVBAでセル範囲のデータをクリップボードに
その他(Microsoft Office)
-
8
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
9
VBA 数値を文字列として貼付したい
Excel(エクセル)
-
10
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
11
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
12
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
13
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
14
EXCELで変数をペーストしたい
その他(プログラミング・Web制作)
-
15
accessのロック
その他(データベース)
-
16
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
17
一つのTeratermのマクロで複数のTeratermのウィンドウを立ち上げることはできますか?
サーバー
-
18
エクセルにペーストする際にカンマ等をセルで分ける方法
Excel(エクセル)
-
19
Access VBA でデータペーストをする
その他(Microsoft Office)
-
20
バッチファイルからVBAに引数を渡したい
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
マクロを使ってフォルダー内に...
-
パス区切りの文字について
-
カンマ区切りの数字をCSVフ...
-
エクセルの区切り位置の設定方法
-
EXCELからCSVにすると余計なカ...
-
ひとつの命令を複数行に記述
-
[VBA][Excel]クリップボードか...
-
メモ帳からエクセルにセル区切...
-
VBScript 日付の比較について
-
PHP カンマをエスケープしたい...
-
カンマ区切りでないテキストをc...
-
WORDで改ページすると時々グレ...
-
CSVファイル中の不規則な数のス...
-
TextBoxに文字が正しく配置され...
-
VB2005のTextBoxでカン...
-
[.NET2.0] メニューに区切り線
-
CSVの定義
-
ExcelでのCSVファイルの編集に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
EXCELからCSVにすると余計なカ...
-
マクロを使ってフォルダー内に...
-
カンマ区切りの数字をCSVフ...
-
CSVの定義
-
WORDで改ページすると時々グレ...
-
何故、日本は未だに数字を3桁...
-
データにカンマが入ったCSVデー...
-
3桁ごと?4桁ごと?コンマの...
-
[VBA][Excel]クリップボードか...
-
カンマ区切り
-
VBAでtxtファイルを読み込む際...
-
「カンマ」と「コンマ」は同じ...
-
パス区切りの文字について
-
メモ帳からエクセルにセル区切...
-
EXCELの文字が指数になる
-
C#で、テキストボックスの入力...
-
PHP カンマをエスケープしたい...
-
カンマ区切りでないテキストをc...
おすすめ情報
A1に貼り付けたいです。
「あい˽うえお˽˽ かきく˽ けこ
さし すせそ」
の場合は 、A1「あい」 B1「うえお」 C1「かきく」 D1「けこ」
A2「さし」B2「すせそ」
となるようにしたいです。
テキストを貼り付け後、「テキストファイルウィザードを使用(U)...」というのを使っているのですが、この動作をマクロ化したいです。最初からこのように書くべきだったかもしれません。
テキストファイルウィザードの設定は区切り文字をスペースにして、あとは添付の画像の様に設定しています。