ギリギリ行けるお一人様のライン

(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.5回答者さま

    無事、別のアプリへの貼り付けができました!
    編集できないピボットテーブルの値からなどもコピーできますね。

    ご記載のとおり単一セルが対象で、間違って複数セルを選択した状態で実行すると、セル番地に関わらず、一番初めに選択したセルが適用されるようですね。

    複数セルからのコピーは、いったん断念します。

    助かりました。
    ありがとうございました!
    コードが読めないのでまだロジックは理解できませんが、精進します!

    No.5の回答に寄せられた補足コメントです。 補足日時:2020/10/21 09:01

A 回答 (11件中1~10件)

ご無沙汰してます。

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
    • good
    • 0
この回答へのお礼

No.5,11回答者さま

確認致しました。
完璧です!
追加でご対応くださり、ありがとうございました。
ほんとう助かりました。

お礼日時:2020/10/30 10:29

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するためのキー操作の一手間が増えちゃいますが。)
    • good
    • 0
この回答へのお礼

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など)をそのままコピーすると、コピー内容として語末に改行が一つ入ってしまうエクセルの仕様のようですね。
すると、結局セルを編集モードにして、文字列をコピーするという作業が必要になってしまうようです。


ありがとうございます。

お礼日時:2020/10/26 12:37

No.8 説明し忘れた。



マクロの4行目の
 Range("N1:N1")
ってのが、作業用のcellの位置(N列1行目)を指定しています。これをどこでも、邪魔にならん場所にあるcellに変えて構いません。
    • good
    • 0
この回答へのお礼

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でしたが、いずれも。もともとフォームが一定でない多くのファイルにおいて行いたいアクションであり、またファイルの保存や共有もするため。)


今さらのご連絡となり大変恐縮ですが、もし気が向き、またいい案があったら、お示しいただけたらうれしいです。

お礼日時:2020/10/25 20:36

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
餃子定食

が貼られます。
「エクセルVBA: セルの計算結果のデータ」の回答画像8
    • good
    • 0

No3です



単一セルではできたようですので、ひとまずよかったですね。
(Value値をクリップボードに送れば良いみたいなので)

>ウェブアプリケーションで貼り付けたいです。
テキストデータを送るとしても、複数セルの場合に、貼り付け先のアプリケーションがどのようなデータであれば解釈できるのかによると思います。

例えば、エクセルの場合は「Tab区切り+改行」のデータでクリップボードに送っているようですが、それでOKなのでしょうか?
ちなみに、エクセルのセル範囲をコピペした場合に、値が表示値になってしまうことはひとまず無視するとして、思った通りの位置関係にペーストされているでしょうか?
もし、位置関係が予定通りになるのであれば、「値を実際のセル値に変えたTab区切りのデータ」を用意すれば良さそうに思われます。

相手のアプリケーションがまったくわからないので、コードにするのもなんなのですが、もしもTab区切りでいけそうな場合の為に、セル範囲をTab区切りデータに変換する説明をしているページがありましたのでご参考までに。
(後半のほうに記されています。データはクリップボードに入れています。)
https://excel-ubara.com/excelvba4/EXCEL_VBA_418. …

※ No5様のTextBoxを介する方法でも、TextBoxをMultiLine(=複数行)にして同様のことを行えばできるはずと思います。
※ あるいは、No2様の回答にあるように、VBAで空セル範囲に「値をペースト」してカットすれば、自動的にクリップボードに入るので、こちらの方が簡単ですね。
(セルの標準書式等のデータもコピーされた状態になりますけれど、ペーストの際に多分無視されると思いますので)
    • good
    • 0
この回答へのお礼

No. 3, 7回答者さま
こちらの確認が遅くなり、大変失礼致しました。

No. 9回答者さまへのレスポンスとして、こちらの望む挙動を記載させていただきました。
こちらはVBAの修正もできないレベルなのです。

こちらのレスポンスが遅くなり恐縮d背うが、もし気が向いたら、ご一考いただけたら幸いです。

お礼日時:2020/10/25 20:40

No.4へのコメントについて



> 3行目: r = readClipboard()
> で、下記エラー

そりゃ
Function readClipboard() As String
以下の部分を入力してないからじゃ?
Sub test()
のところだけじゃダメですよ。
    • good
    • 0

こんなのでイケませんかね?


単一セルを選択した状態で、このマクロを実行するとセルの値がクリップボードにコピーされます。
このマクロを例えば、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
この回答への補足あり
    • good
    • 0
この回答へのお礼

No.5回答者さま
ありがとうございます。

せっかく対応案をいただいたのですが、いまPCを操作できる環境にないので、明日確認のうえ、またご返答させてください。

取り急ぎお礼まで。

お礼日時:2020/10/20 23:32

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 … )
    • good
    • 0
この回答へのお礼

No.4回答者さま
No.1ご回答につづき、記述して実際の挙動までご確認いただいたようで、ありがとうございます!

こちらはWindowなのですが、さっそくやってみたところ、、
ご懸念しておられたCopyToClipBoardより前、
   3行目: r = readClipboard()
で、下記エラーが出てしまいます。
   「コンパイルエラー:
   SubまたはFunctionが定義されていません」

申し訳ないことに、このエラーメッセージを理解できないレベルです。。
もし、もう少しお付き合いいただけるなら、お手すきでご対応いただけたら、うれしい限りです。

お礼日時:2020/10/20 22:49

こんちは



>そのセルの計算結果をテキストデータとしてコピーするVBAを探しています。
そのコピーしたものをどのように使いたいのかによると思います。

どこかのセルに値だけ転写したいのであれば、
 RangeDest.Value = RangeSource.Value
のようにすれば、セル範囲をまとめて転写できます。
(書式等は、転送先のセルの書式に依存します)

転写先がメモ帳のようなものであれば、セルの書式等は無視されますので、Value値をペーストすれば良いだけとなるでしょう。

計算などのために変数に取り込みたいというのであれば、
 ArrayVar = RangeSource.Value
のようにすることで、セル範囲の値(値だけ)をまとめて配列(変数)に取り込めます。
ただし、配列は必ず2次元配列になります(対象が1行とか、1列だけであっても)ので、参照する際には注意が必要になります。
    • good
    • 0
この回答へのお礼

No.3回答者さま
ご回答ありがとうございます。

>>そのセルの計算結果をテキストデータとしてコピーするVBAを探しています。
>そのコピーしたものをどのように使いたいのかによると思います。
当初「エクセルではないソフトで貼り付け」のように書きましたが、より正確には、Officeと互換性の無いウェブアプリケーションで貼り付けたいです。

コピーのしかたをいろいろ変えて貼り付けを試したところ、下記のような状況です。
●貼り付けできない:
・エクセルのセルのコピー(データが適切でも。書式に関わらず。)
●貼り付けできる:
・エクセルのセルの編集モードでのテキスト(数値・文字)のコピー
・メモ帳からのテキスト(数値・文字)のコピー

上記より、「テキスト情報だけクリップボードにコピーできればいい」と解釈しました。
しかし「テキスト情報」という言葉も適当です。
厳密には「上記のように貼り付けできる状態でクリップボードにコピーしたい」というのが目的です。

ただし、下記の条件が付きます。
●セル編集モードにおいてではなく、セルを選択している状態からコピーしたい
●セルに入った計算式ではなく、計算結果をコピーしたい
●書式に依存する表示どおりではなく、セル内で計算式を確定(F9押下など)させたときの素のデータ(当初の例で申し上げると「12345.6」)をコピーしたい。


以下、初めに書きそびれてしまいましたが、自分でVBAを記述する知識が無く、目的にあったVBAをネット上で見つけて使う程度のレベルです。

自分ではできないのですが、ひたすら注文を付けるばかりで恐縮です。
もう少しお付き合いいただけたら幸いです。

お礼日時:2020/10/20 19:14

ん?


空いているセルに「値」として”貼り付け”て、それを”カット”すれば良いんじゃないかな。

空いているセルに書き出したくないというなら、
セルの値をコピーしてクリップボードに保存する前に、セルの表示形式を変えておく必要がある。
表示形式を調べ記録し、そののちに表示形式を「標準」にしてコピー。
そして記録した表示形式に戻すとか。
他にも面倒なやり方もあるけど、この手順が一番分かりやすいはず。

・・・
連続したエリアとか、連続していないエリアをどうにかしたいなら、
その範囲に名前を付けて、その範囲名で対処しましょう。


と言う事でアドバイスをしてみました。
考え方をちょっと変えるだけで対処可能ということです。

「横着するためにマクロを使いたい」と思う前に、
Excel本来の機能で何が出来るのかを知ることから始めてみませんか?
    • good
    • 1
この回答へのお礼

>No.2回答者さま
ご回答ありがとうございます。
ご記載いただいた内容は理解できます。

ただ、貼り付けたい先のソフトの仕様上、たとえ書式が「標準」のセルからコピーしたとしても貼り付けられず、当初こちらが記載した現状の2種の対応方法ならばできる状況です。
(説明不足だったかもしれません。失礼致しました。)

また、ご記載いただいた方法に対して、現状の対応方法(例えば、F2 → F9 → Ctrl+C → Esc)のほうがまだ楽なように思います。
そしてその現状の運用方法すら(おおよそ10分間で100件超などと)アクションが高頻度なため、手間だと感じています。

上記のような理由から「横着するためにマクロを使いたい」次第です。
こちらの意図や条件がわかりづらい質問文だったようで、失礼致しました。

お礼日時:2020/10/20 17:33

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

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


おすすめ情報