- ベストアンサー
エクセル:桁区切り「カンマ」でセルが分割されて貼り付けされてしまう
仕事で社内のシステムから売上の情報をコピーしてエクセルに貼り付けて処理をしようとしたところ、コピーした数字に「桁区切りのカンマ","」がある関係で、 たとえば 1,234,567 という数字が 1 と 234 と 567 とセルが分割されて貼り付けられてしまいます。 CSVファイルのカンマ区切りデータと同じように情報がカンマで分割されてしまっているようなのですが、貼り付けの際に分割されないようにするにはどうしたらよいでしょうか? ちなみに、これらデータはスペースで区切られているので一度テキストファイルに保存して、CSVを開くときの区切り文字の設定を「スペース」に設定すればうまく開くのはわかるのですが、コピーして即貼り付けのときにこのようになることを回避する方法はあるのでしょうか?マクロを組んでも構いません。 どうぞ、ご教授、宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Excel2000の場合ですが メニューの「データ」→「区切り位置」の設定によって 貼り付けるデータが分解される場合があります。 区切りコードにカンマが指定されているのではないでしょうか?
その他の回答 (4)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。始めに長文すみません。 本件は HTML は全く関係ないみたいです。忘れて下さい。混乱させてすみません でした。Hayashi_Trek さん、勉強になりました^^ もう解決かもしれませんが、ちょっと違う視点から VBA コードを書いてみました ので、良かったらお試し下さい。コードの概略は、 1. クリップボードの文字列を読み込み 2. 1.の文字列のうち、数字桁区切りのカンマを置換で削除 3. クリップボードへ加工済みの文字列を転送 4. ペースト です。 Auto_Open を実行すると、次の独自ショートカットキーにマクロを割り当てます。 ・[Ctrl]+[Shift]+[V] メニューから PasteClipBoardData を実行するか、このショートカットキーで 桁区切りカンマが削除されたデータがペーストされます。 余談ですが、今回のクリップボード操作は、 ・半角カナは全角カナに置換されてペースト ・英数字は全て半角に置換されてペースト ・特定の文字が追加されてペースト など色々と応用ができそうです。アドインにしても面白いかもしれません。(^^) 使い方ですが、諸事情で参照設定が必要です。VBE の [ツール]-[参照設定] で 以下のものをチェックしてから、標準モジュールにコピペして下さい。 ・参照設定: Microsoft Forms 2.0 Object Library ・参照設定: Microsoft VBScript Regular Expressions x.x では。 ’--------- 以下コード(標準モジュール) -------------------------- Option Explicit Sub Auto_Open() '独自ショートカットキー割当 Application.OnKey "+^v", "PasteClipBoardData" '[Ctrl]+[Shift]+[V] End Sub Sub Auto_Close() '独自ショートカットキー割当解除 Application.OnKey "+^v" End Sub Sub PasteClipBoardData() Dim strText As String On Error GoTo ERROR_HANDLER ' クリップボードのテキストを取得してみる strText = CB_GetText() ' strText が vbNullString でなければ If strText <> vbNullString Then ' 加工して再度 ClipBoard に転送 strText = DropOutComma(strText) strText = Trim$(strText) Call CB_SetText(strText) End If ' ペースト ActiveSheet.Paste Exit Sub ERROR_HANDLER: MsgBox "Error(" & Err.Number & ")" & vbCrLf _ & Err.Description, vbCritical End Sub Private Function DropOutComma(ByVal strText As String) As String '----------------------------------------------------------------- ' @Description: 対象文字列から数値桁区切りのカンマを削除する ' @Param : strText 対象文字列 ' @Return : String '----------------------------------------------------------------- ' 参照設定: Microsoft VBScript Regular Expressions x.x Dim RE As RegExp Dim MC As MatchCollection Dim M As Match On Error GoTo ERROR_HANDLER Set RE = New RegExp With RE .Pattern = ",(\d{3,})" '<-- 検索後のマッチングパターン .IgnoreCase = False .Global = True End With Set MC = RE.Execute(strText) If MC.Count > 0 Then For Each M In MC 'ここで置換してます strText = Replace(strText, M.Value, M.SubMatches.Item(0)) Next M End If DropOutComma = strText Set MC = Nothing Set RE = Nothing Exit Function ERROR_HANDLER: Err.Raise Err.Number, Err.Source, Err.Description End Function Private Function CB_GetText() As String '----------------------------------------------------------------- ' @Description: クリップボードの文字列を取得する (DataObject経由) ' @Return : String '----------------------------------------------------------------- '参照設定: Microsoft Forms 2.0 Object Library Dim CB As DataObject Dim strText As String Const TEXT_FORMAT = 1& On Error GoTo ERROR_HANDLER Set CB = New DataObject With CB .GetFromClipboard If .GetFormat(TEXT_FORMAT) Then strText = .GetText Else strText = vbNullString End If End With Set CB = Nothing CB_GetText = strText Exit Function ERROR_HANDLER: Err.Raise Err.Number, Err.Source, Err.Description End Function Private Function CB_SetText(ByVal strText As String) As Boolean '----------------------------------------------------------------- ' @Description: クリップボードに対象文字列を転送する (DataObject経由) ' @Param : strText 対象文字列 ' @Return : Boolean 成功 True/失敗 False '----------------------------------------------------------------- '参照設定: Microsoft Forms 2.0 Object Library Dim CB As DataObject Const TEXT_FORMAT = 1& On Error GoTo ERROR_HANDLER If strText <> vbNullString Then Set CB = New DataObject With CB .Clear ' DataObject にテキストを転送 .SetText strText, TEXT_FORMAT ' DataObject からクリップボードへ転送 .PutInClipboard End With Set CB = Nothing CB_SetText = True End If Exit Function ERROR_HANDLER: Err.Raise Err.Number, Err.Source, Err.Description End Function
お礼
何度も回答いただきありがとうございます。 それにこれだけのマクロをわざわざ組んでいただいて本当にいろいろとありがとうございます。 私にはここまでのマクロを組むだけの力がありませんが、色々と勉強になりました。 ありがとうございました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
ああ、、社内システムってのは ブラウザ上で稼動しているものですか? 数字の間に タブコードが入ってるのだとか、スタイルシート絡みの影響 ではないかと思いますが、現状ではイマイチ確信をもてません。 ブラウザ上で右クリックし、「ソースの表示」でその問題の数字部分の HTMLソースを補足して下さい。
補足
確かにプラウザ上(エクスプローラー)で稼動していますが、HTMLで表示されているのではなく、なんていうんでしょう?これ? バックが黒い画面に緑色の文字で表示されているのです。DOSでしょうか?ウインドウズでODSのコマンドラインを使う画面に似ています。これでもHTMLなのでしょうか?ツールバーなどが表示されないので、ソースの表示も出来ません。 プラウザ上とは言わないのでしょうか?
- KenKen_SP
- ベストアンサー率62% (785/1258)
私も再現できないです。 ただ、セルをダブルクリックして編集モードにしてからペーストするか、数式バーにペーストすれば解決する気はします。
補足
ありがとうございます。 確かにそういった方法もありますね。 ただ、残念ながらコピーしたデータは複数有り、一度に大量のセルに貼り付けたいのです。ひとつひとつでは対応が出来ないのです。 残念です。
- ao777
- ベストアンサー率34% (43/123)
1,234,567が どのような書式になっているかわかりませんが、 普通に1,234,567 と入れてコピーしたけど問題は なかったです。 一応、貼り付けする時に、右クリック→形式を指定して 貼り付け→値と数値の書式でできませんか?
補足
早速の回答ありがとうございます。 形式を選択して貼り付けをしようと思ったのですが、選択できる形式が「Unicodeテキスト」と「テキスト」しか出てこなく、いわゆる書式や値、数式などを選択できません。 ao777さんがおっしゃるとおり、メモ帳に自分でキーボードを使って1,234,567と打ってからコピーするとちゃんと一つのセルに収まりますねぇ・・・。 なにか違いがあるのか確認してみます。
お礼
今回はありがとうございました。 原因もわかりました。 まず、他のエクセルマクロを起動した跡にこの現象が起きていたのですが、このマクロの中に、テキストファイルをカンマ区切りで開くようなプログラムがあり、この作業が終わっても、そのシートを閉じても、エクセルが起動されつづけていれば、その”,”カンマ区切りのシート設定が有効になったままになるということが判明しました。 したがって、今回の現象はそういった処理をした後に、カンマの桁区切りを含んだ数字(文字列)をペーストしたから、このようになってしまったということです。 ですので、テキストファイルをカンマ区切りで開くマクロの中に終了時に、デフォルトの状態に戻すようなマクロを組んでおけば影響がないということになりそうです。 エクセルの桁区切りの機能は始めて知ったので、非常に勉強になりました。ありがとうございました。
補足
回答ありがとうございます。 確かにこの方法で区切り位置の変更を行ってから貼り付けることによって、カンマでのセル分割はなくなりました。ありがとうございます。 ただ、なんでこのようなことが発生してしまうのか原因がわかれば、今後の対応も可能なのですが・・・。 ただ、解決策にはなりそうです。