
(1)
単一のシート内の、数式が入った単一のセルを選択した状態(入力モードや編集モードではない)において、そのセルの計算結果をテキストデータとしてコピーするVBAを探しています。
単にセルを選択してコピーするだけでは、書式情報もコピーされてしまいます。
例えば、計算結果が「12345.6」で書式「通貨」のとき、表示は「¥12,346 」となり、コピーされるデキストデータも「¥12,346 」となります。
しかし、円マークやカンマや半角スペースを含まず、数値を丸めもしていない、「12345.6」というテキスト情報だけをコピーしたいです。
さらに詳しく言うと、(一般的にエクセルでセルがコピーされるときにどのような書式情報が含まれるのか知らないのですが)、メモ帳でテキストを選択してコピーしたときと同じ形式で、計算結果だけをクリップボードへコピーしたいのです。
(2)
欲を言えば、単一のシート内で連続した複数のセルを選択した状態で、それらのセルのデータを連続したテキストとしてコピーできたら、なおうれしいです。
(この際、セルを認識する順番が問題になりますが、「論理順」と言うのでしょうか、おそらく一般的な下記のような順番だと助かります。「上の行から優先して、1行内で選択した列を順番に認識したら、次の行へ」というイメージです。)
(3)
さらに欲を言えば、単一のシート内で連続していない(飛び地の)複数のセルを選択した状態で、同様にできたら、最高です!
(セルを認識する順番は上記と同様)
背景として、Officeとは別のソフトにデータを貼り付けたいのですが、セルを選択して単純にコピーしただけでは貼り付けられないという状況からです。
現状では、下記のいずれかの方法で対応していますが、実行頻度がとても高いため、VBAのショートカットを充てて、楽をしたいと考えています。
(あ)セルの編集モードにして → 計算結果を確定させて → コピーして → 編集モードを閉じる(F2 → F9 → Ctrl+C → Esc)
(い)セルを単純にコピーして、いったん「メモ帳」などのソフトに貼り付けてから、さらにそれをコピー
エクセルのバージョンにはあまり依存しないと思いますが、当方の環境はOffice 365 ProPlusです。
長文でわかりづらく、すみません!
「欲を言えば」の(2)と(3)は、できればありがたいですが、(1)だけでもお知恵をお借りできたら幸いです。
よろしくお願い致します!
No.11ベストアンサー
- 回答日時:
ご無沙汰してます。
No.5です。まだ締め切っていなかったんですね。話が進んでいて、付いていけてるか分かんないのですが、複数セルの値を単純に連結するだけなら、こんな感じでイケませんかね。
Sub Macro1()
Dim r As Range
With ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1")
With .Object
.Text = ""
For Each r In Selection
.Text = .Text & r.Value
Next r
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
.Delete
End With
End Sub
No.10
- 回答日時:
No.9へのコメントについて。
> 1. (例にならうと)下記のデータがクリップボードに入る
> ABC346231234Yahoho9877999999499999.5249999.75餃子定食(改行なし)
ならば、改行文字CRをくっつけるのをやめる。
s = s + it + CR
を
s = s + it
に変更。(しかし、一切区切りなしでホントにいいんですか?)
> 2. ワークシート内のセルはいずれも編集しないこと
作業用として別のワークブックを用意しておけば解決しますね。そのワークブックを”WB.xlsb”としましょう。予め、新しいワークブックをこの名前でsaveしておくだけです。で、マクロを使う以前にそれを開いておく。
また、
Set workR = Range("N1:N1")
を
Set workR = Workbooks("WB.xlsb").Worksheets("Sheet1").Range("A1:A1")
に変更する。これで、WB.xlsbのSheet1のセルA1が作業用として使われるようになります。
> 2. クリップボードにコピーはされず(クリップボードが空にまではなる)
そりゃびっくりです。Windowsは分からんもんですな。
With workR
の前に
Windows("WB.xlsb").Activate
workR.Select
を入れとけば、少なくともCopy直前の状態にはなるでしょう。(Copyするためのキー操作の一手間が増えちゃいますが。)
No. 10回答者さま
引き続きお付き合いくださり、ありがとうございます!
(1)
>>例にならうと)下記のデータがクリップボードに入る
>>ABC346231234Yahoho9877999999499999.5249999.75餃子定食(改行なし)
>ならば、改行文字CRをくっつけるのをやめる。
> s = s + it + CR
>を
> s = s + it
>に変更。(しかし、一切区切りなしでホントにいいんですか?)
区切り無しでよいので、この部分はできました。
(2)
>>ワークシート内のセルはいずれも編集しないこと
>作業用として別のワークブックを用意しておけば解決しますね。そのワークブックを”WB.xlsb”としましょう。予め、新しいワークブックをこの名前でsaveしておくだけです。で、マクロを使う以前にそれを開いておく。
>また、
> Set workR = Range("N1:N1")
>を
> Set workR = Workbooks("WB.xlsb").Worksheets("Sheet1").Range("A1:A1")
>に変更する。これで、WB.xlsbのSheet1のセルA1が作業用として使われるようになります。
個人用マクロブックを指定してもできました。
(3)
>> クリップボードにコピーはされず(クリップボードが空にまではなる)
>そりゃびっくりです。Windowsは分からんもんですな。
> With workR
>の前に
> Windows("WB.xlsb").Activate
> workR.Select
>を入れとけば、少なくともCopy直前の状態にはなるでしょう。(Copyするためのキー操作の一手間が増えちゃいますが。)
ご指摘のとおり、コピーする手間は残ってしまいますね。
また、選択されたセル(WB.xlsbのSheet1のセルA1など)をそのままコピーすると、コピー内容として語末に改行が一つ入ってしまうエクセルの仕様のようですね。
すると、結局セルを編集モードにして、文字列をコピーするという作業が必要になってしまうようです。
ありがとうございます。
No.9
- 回答日時:
No.8 説明し忘れた。
マクロの4行目の
Range("N1:N1")
ってのが、作業用のcellの位置(N列1行目)を指定しています。これをどこでも、邪魔にならん場所にあるcellに変えて構いません。
No. 1, 4, 6, 8, 9回答者さま
レスポンスが遅くなり、大変失礼致しました。
確認させていただいたところ、挙動は下記のとおりでした。
1. エラーは出ない
2. クリップボードにコピーはされず(クリップボードが空にまではなる)
3. セルN1に(例にならうと)下記のデータが入って
ABC(改行)
34623(改行)
1234(改行)
Yahoho(改行)
9877(改行)
999999(改行)
499999.5(改行)
249999.75(改行)
餃子定食(改行)
4. セルN1が選択された
こちらの情報が不十分でしたので申し訳ないのですが、前提として下記の条件を望んでいました。
1. (例にならうと)下記のデータがクリップボードに入る
ABC346231234Yahoho9877999999499999.5249999.75餃子定食(改行なし)
(コピー元の複数セルの配置は、複数行かつ複数列になることはなく、単一行内の複数セル、または、単一列内の複数セル)
2. ワークシート内のセルはいずれも編集しないこと(今回はN1でしたが、いずれも。もともとフォームが一定でない多くのファイルにおいて行いたいアクションであり、またファイルの保存や共有もするため。)
今さらのご連絡となり大変恐縮ですが、もし気が向き、またいい案があったら、お示しいただけたらうれしいです。
No.8
- 回答日時:
Clipboardを直接いじるのは危ないっぽいので、Windowsでもイケそうなのを考えました。
ただし、作業用のcell(どこにあってもいい)を1個だけ必要とします。★操作法:同一シート上の複数のcell(バラバラにあって良い)を選択しておいて、以下のマクロを実行する。すると、他のアプリケーションにPasteできる文字列がclipboardに入ります。
Sub copyIt()
Dim workR As Range, rng As Range, slct As Range
Dim s As String, it As String
Set workR = Range("N1:N1")
CR = Chr(13)
Set slct = Selection
For i = 1 To slct.Areas.Count
Set rng = slct.Areas(i)
With rng
rws = .Rows.Count
cls = .Columns.Count
For c = 1 To cls
For R = 1 To rws
Application.CutCopyMode = False
.Cells(R, c).Copy
workR.PasteSpecial Paste:=xlValues
it = workR.Cells(1, 1).Value
s = s + it + CR
Next R
Next c
End With
Next i
Application.CutCopyMode = False
With workR
.Value = s
.Copy
.WrapText = False
End With
End Sub
例えば、添付図のように選択した場合、他のアプリに行ってpasteすると、
ABC
34623
1234
Yahoho
9877
999999
499999.5
249999.75
餃子定食
が貼られます。

No.7
- 回答日時:
No3です
単一セルではできたようですので、ひとまずよかったですね。
(Value値をクリップボードに送れば良いみたいなので)
>ウェブアプリケーションで貼り付けたいです。
テキストデータを送るとしても、複数セルの場合に、貼り付け先のアプリケーションがどのようなデータであれば解釈できるのかによると思います。
例えば、エクセルの場合は「Tab区切り+改行」のデータでクリップボードに送っているようですが、それでOKなのでしょうか?
ちなみに、エクセルのセル範囲をコピペした場合に、値が表示値になってしまうことはひとまず無視するとして、思った通りの位置関係にペーストされているでしょうか?
もし、位置関係が予定通りになるのであれば、「値を実際のセル値に変えたTab区切りのデータ」を用意すれば良さそうに思われます。
相手のアプリケーションがまったくわからないので、コードにするのもなんなのですが、もしもTab区切りでいけそうな場合の為に、セル範囲をTab区切りデータに変換する説明をしているページがありましたのでご参考までに。
(後半のほうに記されています。データはクリップボードに入れています。)
https://excel-ubara.com/excelvba4/EXCEL_VBA_418. …
※ No5様のTextBoxを介する方法でも、TextBoxをMultiLine(=複数行)にして同様のことを行えばできるはずと思います。
※ あるいは、No2様の回答にあるように、VBAで空セル範囲に「値をペースト」してカットすれば、自動的にクリップボードに入るので、こちらの方が簡単ですね。
(セルの標準書式等のデータもコピーされた状態になりますけれど、ペーストの際に多分無視されると思いますので)
No. 3, 7回答者さま
こちらの確認が遅くなり、大変失礼致しました。
No. 9回答者さまへのレスポンスとして、こちらの望む挙動を記載させていただきました。
こちらはVBAの修正もできないレベルなのです。
こちらのレスポンスが遅くなり恐縮d背うが、もし気が向いたら、ご一考いただけたら幸いです。
No.6
- 回答日時:
No.4へのコメントについて
> 3行目: r = readClipboard()
> で、下記エラー
そりゃ
Function readClipboard() As String
以下の部分を入力してないからじゃ?
Sub test()
のところだけじゃダメですよ。
No.5
- 回答日時:
こんなのでイケませんかね?
単一セルを選択した状態で、このマクロを実行するとセルの値がクリップボードにコピーされます。
このマクロを例えば、Ctrl+e に登録しておけば、Ctrl+e 、Ctrl+v で、コピペできるはずです。
Sub Macro1()
With ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1")
With .Object
.Text = Selection(1).Value
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
.Delete
End With
End Sub
No.5回答者さま
ありがとうございます。
せっかく対応案をいただいたのですが、いまPCを操作できる環境にないので、明日確認のうえ、またご返答させてください。
取り急ぎお礼まで。
No.4
- 回答日時:
Macでやってます。
まずはcopyしたものをclipboardから読み取って、文字列sに変換する必要がありますね。
Function readClipboard() As String
Dim cp As MSForms.DataObject
Dim s As String
Set cp = New MSForms.DataObject
cp.GetFromClipboard
readClipboard = cp.GetText
End Function
で読み取ることができる。
しかし、cellの表示が”¥123,456”だったら、読み取られるのも”¥123,456”です。これを数値に変換しなくちゃいけない。(もちろん、読み取った文字列を文字列のままにしたいということだと、変換はいらない。)
CCUR( )関数を使うと、”¥123,456”の場合には数値123456にできますが、他のタイプの文字列(例えば”123”)だとエラーになる。Val( )関数だと”123”はいいけど、”¥123,456”は答が0になっちゃう。ま、そこは置いといて、とりあえずCCUR( )でイケル場合だけを考えます。
で、CCUR( )で得た数値を文字列"123456"に変換するにはStr( )関数でいいでしょ。次に、
Sub CopyToClipBoard(s As String)
With New MSForms.DataObject
.SetText s
.PutInClipboard
End With
End Sub
で文字列sをclipboardに入れられる。これで、他のソフトでpasteした時にその文字列が貼り付けられます。
ともあれ
Sub test()
Dim t As Double
r = readClipboard()
t = CCur(r)
CopyToClipBoard Str(t)
End Sub
で一応動きましたけど。
(しかしWindowsの場合はCopyToClipBoardをやるのがどうも厄介そうで、これかな?→
https://wellsr.com/vba/2015/tutorials/vba-copy-t … )
No.4回答者さま
No.1ご回答につづき、記述して実際の挙動までご確認いただいたようで、ありがとうございます!
こちらはWindowなのですが、さっそくやってみたところ、、
ご懸念しておられたCopyToClipBoardより前、
3行目: r = readClipboard()
で、下記エラーが出てしまいます。
「コンパイルエラー:
SubまたはFunctionが定義されていません」
申し訳ないことに、このエラーメッセージを理解できないレベルです。。
もし、もう少しお付き合いいただけるなら、お手すきでご対応いただけたら、うれしい限りです。
No.3
- 回答日時:
こんちは
>そのセルの計算結果をテキストデータとしてコピーするVBAを探しています。
そのコピーしたものをどのように使いたいのかによると思います。
どこかのセルに値だけ転写したいのであれば、
RangeDest.Value = RangeSource.Value
のようにすれば、セル範囲をまとめて転写できます。
(書式等は、転送先のセルの書式に依存します)
転写先がメモ帳のようなものであれば、セルの書式等は無視されますので、Value値をペーストすれば良いだけとなるでしょう。
計算などのために変数に取り込みたいというのであれば、
ArrayVar = RangeSource.Value
のようにすることで、セル範囲の値(値だけ)をまとめて配列(変数)に取り込めます。
ただし、配列は必ず2次元配列になります(対象が1行とか、1列だけであっても)ので、参照する際には注意が必要になります。
No.3回答者さま
ご回答ありがとうございます。
>>そのセルの計算結果をテキストデータとしてコピーするVBAを探しています。
>そのコピーしたものをどのように使いたいのかによると思います。
当初「エクセルではないソフトで貼り付け」のように書きましたが、より正確には、Officeと互換性の無いウェブアプリケーションで貼り付けたいです。
コピーのしかたをいろいろ変えて貼り付けを試したところ、下記のような状況です。
●貼り付けできない:
・エクセルのセルのコピー(データが適切でも。書式に関わらず。)
●貼り付けできる:
・エクセルのセルの編集モードでのテキスト(数値・文字)のコピー
・メモ帳からのテキスト(数値・文字)のコピー
上記より、「テキスト情報だけクリップボードにコピーできればいい」と解釈しました。
しかし「テキスト情報」という言葉も適当です。
厳密には「上記のように貼り付けできる状態でクリップボードにコピーしたい」というのが目的です。
ただし、下記の条件が付きます。
●セル編集モードにおいてではなく、セルを選択している状態からコピーしたい
●セルに入った計算式ではなく、計算結果をコピーしたい
●書式に依存する表示どおりではなく、セル内で計算式を確定(F9押下など)させたときの素のデータ(当初の例で申し上げると「12345.6」)をコピーしたい。
以下、初めに書きそびれてしまいましたが、自分でVBAを記述する知識が無く、目的にあったVBAをネット上で見つけて使う程度のレベルです。
自分ではできないのですが、ひたすら注文を付けるばかりで恐縮です。
もう少しお付き合いいただけたら幸いです。
No.2
- 回答日時:
ん?
空いているセルに「値」として”貼り付け”て、それを”カット”すれば良いんじゃないかな。
空いているセルに書き出したくないというなら、
セルの値をコピーしてクリップボードに保存する前に、セルの表示形式を変えておく必要がある。
表示形式を調べ記録し、そののちに表示形式を「標準」にしてコピー。
そして記録した表示形式に戻すとか。
他にも面倒なやり方もあるけど、この手順が一番分かりやすいはず。
・・・
連続したエリアとか、連続していないエリアをどうにかしたいなら、
その範囲に名前を付けて、その範囲名で対処しましょう。
と言う事でアドバイスをしてみました。
考え方をちょっと変えるだけで対処可能ということです。
「横着するためにマクロを使いたい」と思う前に、
Excel本来の機能で何が出来るのかを知ることから始めてみませんか?
>No.2回答者さま
ご回答ありがとうございます。
ご記載いただいた内容は理解できます。
ただ、貼り付けたい先のソフトの仕様上、たとえ書式が「標準」のセルからコピーしたとしても貼り付けられず、当初こちらが記載した現状の2種の対応方法ならばできる状況です。
(説明不足だったかもしれません。失礼致しました。)
また、ご記載いただいた方法に対して、現状の対応方法(例えば、F2 → F9 → Ctrl+C → Esc)のほうがまだ楽なように思います。
そしてその現状の運用方法すら(おおよそ10分間で100件超などと)アクションが高頻度なため、手間だと感じています。
上記のような理由から「横着するためにマクロを使いたい」次第です。
こちらの意図や条件がわかりづらい質問文だったようで、失礼致しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルからビジオのリンク貼り付け 1 2023/03/30 17:51
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
- Visual Basic(VBA) Excel(VBA) 特定の条件に該当する行の値、書式を同じセルにコピ&ペーストしたいです 1 2022/05/21 18:18
- Excel(エクセル) マクロVBA別Excelブックにデータ転記 2 2022/07/10 23:35
- Excel(エクセル) Excelに文字データのみを貼り付けたい 8 2023/05/03 15:38
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Excel(エクセル) シート参照を含む数式を連続コピー 3 2022/12/10 11:42
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) エクセル ブック間のコピー 5 2022/04/24 08:11
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
VBA 数式ではなく計算結果をセルに入れたい
Excel(エクセル)
-
【Excel VBA】計算結果のみ表示させたい
Excel(エクセル)
-
VBAで計算結果のみ表示させたい
Excel(エクセル)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
貼り付けで複数セルに貼り付けたい
-
【Excel】 セルの色での判断は...
-
EXCEL VBA セルに既に入...
-
セルをクリック⇒そのセルに入力...
-
excelの特定のセルの隣のセル指...
-
(Excel)数字記入セルの数値の後...
-
エクセルの書式設定の表示形式...
-
Excelでのコメント表示位置
-
枠に収まらない文字を非表示に...
-
エクセルのセルの枠を超えて文...
-
【エクセル】IF関数 Aまたは...
-
エクセル オートフィルタで絞...
-
エクセルの一つのセルに複数の...
-
Excel 例A(1+9) のように番地の...
-
対象セル内(複数)が埋まった...
-
数式を残したまま、別のセルに...
-
Excelで数式内の文字色を一部だ...
-
Excelで住所を2つ(町名迄と番...
-
文字列として"(ダブルコーテー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
貼り付けで複数セルに貼り付けたい
-
エクセルで指定したセルのどれ...
-
excelの特定のセルの隣のセル指...
-
(Excel)数字記入セルの数値の後...
-
セルをクリック⇒そのセルに入力...
-
枠に収まらない文字を非表示に...
-
【エクセル】IF関数 Aまたは...
-
【Excel】 セルの色での判断は...
-
Excelでのコメント表示位置
-
エクセルの一つのセルに複数の...
-
エクセルのセルの枠を超えて文...
-
Excelで数式内の文字色を一部だ...
-
EXCEL VBA セルに既に入...
-
エクセルの書式設定の表示形式...
-
Excel 例A(1+9) のように番地の...
-
数式を残したまま、別のセルに...
-
エクセル オートフィルタで絞...
-
Excelで、「特定のセル」に入力...
-
ハイパーリンクの参照セルのズ...
-
対象セル内(複数)が埋まった...
おすすめ情報
No.5回答者さま
無事、別のアプリへの貼り付けができました!
編集できないピボットテーブルの値からなどもコピーできますね。
ご記載のとおり単一セルが対象で、間違って複数セルを選択した状態で実行すると、セル番地に関わらず、一番初めに選択したセルが適用されるようですね。
複数セルからのコピーは、いったん断念します。
助かりました。
ありがとうございました!
コードが読めないのでまだロジックは理解できませんが、精進します!