VBA技術解説
シングルクォートの削除とコピー(PrefixCharacter)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-11-04 最終更新日:2019-11-04

シングルクォートの削除とコピー(PrefixCharacter)


セルに入力した先頭の'シングルクォーテーションは特殊なものとなっています。
通常は、数値を文字としてセルに入れるときに使っているものです。
マクロVBAでセル値を取得すると、この'シングルクォーテーションはValueでは取得できません。
したがって、
セル.Value = セル.Value
これを実行すると、先頭の'シングルクォーテーションは消えてしまいます。
セルのコピーでは'シングルクォーテーションも含めてコピーされますが、値貼り付けでは消えてしまいます。


'シングルクォーテーションを除去する方法、残してValueをコピーする方法等について説明します。

シングルクォーテーション意味

セルに、'シングルクォーテーションから数値を入れると文字列として扱われ左寄せになります。

VBA マクロ PrefixCharacter シングルクォーテーション

VBA マクロ PrefixCharacter シングルクォーテーション

VBA マクロ PrefixCharacter シングルクォーテーション

この仕様はLotus1-2-3から引き継いだものだという事ですが、
オプションで、Lotus1-2-3のキー操作に変更することができます。
オプションの一番下に設定があります。

VBA マクロ PrefixCharacter シングルクォーテーション

ここでは詳しく説明しませんが、
Lotus1-2-3のキー操作では、
「'」左寄せ、「^」中央寄せ、「"」右寄せ、「\」セル幅に繰り返す
これらがあります。
オプションでLotus1-2-3のキー操作にチェックを付けていない場合は、「'」左寄せのみ有効な状態といえるでしょう。

VBAでシングルクォーテーションがコピーされる場合と消える場合

シングルクォーテーションがコピーされる場合
・カット&ペースト
・コピー&ペースト

VBAの例としては
Range("A:B").Copy Destination:=Range("C1")

Range("A1:B2").Copy
Range("C1").PasteSpecial Paste:=xlPasteAll

シングルクォーテーションが消える場合
・コピー&値貼り付け
ただし、コピー先がすでにシングルクォーテーションが付いている場合は残ります。

VBAの例としては
Range("A:B").Copy
Range("C1").PasteSpecial Paste:=xlPasteValues

Range("C1:D1").Value = Range("A1:B1").Value

VBAでのシングルクォーテーションの取得方法

Rangeオブジェクトに、PrefixCharacterプロパティがあります。
PrefixCharacterプロパティは、セルのプレフィックス文字を返します。

ApplicationのTransitionNavigKeysプロパティの値により、PrefixCharacterプロパティは以下の値を返します。
・Falseの場合、 'または空白になります。
・Trueの場合、'左揃え、"右揃え、^中央寄せ、\繰り返し、または空白になります。

VBAでシングルクォーテーションを取り除くVBA

Public Sub prefixDelete(argRange As Range)
  '対象セル範囲を使用セル範囲に限定
  Dim ws As Worksheet
  Set ws = argRange.Worksheet
  Set argRange = Intersect(ws.Range(argRange.Item(1), _
               ws.UsedRange(ws.UsedRange.Count)), _
               argRange)

  'プレフィックス文字がある場合のみValueをコピー
  Dim myRange As Range
  For Each myRange In argRange
    If myRange.PrefixCharacter <> "" Then
      myRange.Value = myRange.Value
    End If
  Next
End Sub

PrefixCharacterが空白以外の時だけValueをコピーしています。
広いセル範囲が指定された場合の無駄なコピーを省くために、UsedRangeの範囲に限定しています。

使い方は
Call prefixDelete(Range("A:B"))

VBAでシングルクォーテーションを含めて値コピーするVBA

Public Sub prefixCopy(ByVal fromRange As Range, _
           ByVal toRange As Range)
  'コピー元範囲を使用セル範囲に限定
  Dim ws As Worksheet
  Set ws = fromRange.Worksheet
  Set fromRange = Intersect(ws.Range(fromRange.Item(1), _
               ws.UsedRange(ws.UsedRange.Count)), _
               fromRange)
  
  'Prefixを付けてVlueをコピー
  Dim fRng As Range, tRng As Range
  Dim i1 As Long, i2 As Long
  For i1 = 1 To fromRange.Rows.Count
    For i2 = 1 To fromRange.Columns.Count
      With fromRange.Item(i1, i2)
        toRange.Item(i1, i2).Value = .PrefixCharacter & .Value
      End With
    Next
  Next
End Sub

プレフィックスを付けてValueをコピーしています。
コピー先のセル範囲の大きさは考慮していません。
コピー先の先頭セルからコピー元の大きさでコピーしています。

使い方は
Call prefixCopy(Range("A:B"), Range("C1"), True)


ちなみに、プレフィックスを取り除いてコピーする場合は
toRange.Resize(fromRange.Rows.Count, fromRange.Columns.Count).Value = fromRange.Value

これだけで済みます。



同じテーマ「マクロVBA技術解説」の記事

VBAのマルチステートメント(複数のステートメントを同じ行に)
クリップボードに2次元配列を作成してシートに貼り付ける
ユーザー定義型の制限とクラスとの使い分け
シングルクォートの削除とコピー(PrefixCharacter)
空文字列の扱い方と処理速度について(""とvbNullString)
VBAにおける変数のメモリアドレスについて
Evaluateメソッド(文字列の数式を実行します)
Rangeオブジェクトの論理演算(差集合と排他的論理和)
VBAで写真の撮影日時や音楽動画の長さを取得する
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する


新着記事NEW ・・・新着記事一覧を見る

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ