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のマルチステートメント(複数のステートメントを同じ行に)

・VBAでのステートメントという用語について ・行継続(1ステートメントを複数の行に) ・VBAマルチステートメントの基本 ・VBAマルチステートメントの応用 ・マルチステートメントの最後に
クリップボードに2次元配列を作成してシートに貼り付ける
・クリップボードのデータ取得/クリップボードへデータ送信 ・エクセルの行・列のデータ ・クリップボードに2次元配列を作成してシートに貼り付けるVBA ・クリップボードに2次元配列の最後に
ユーザー定義型の制限とクラスとの使い分け
・ユーザー定義型 ・クラスについて ・ユーザー定義型とクラスの速度比較 ・ユーザー定義型の制限 ・ユーザー定義型の制限とクラスとの使い分け
シングルクォートの削除とコピー(PrefixCharacter)
空文字列の扱い方と処理速度について(""とvbNullString)
・String型変数のメモリ配置と取得する関数 ・空文字列について ・String変数に空文字列を入れる ・セルに空文字列を入れる ・Stringが空文字列か判定 ・InputBox関数の戻り値が空文字列判定 ・空文字列の処理方法による速度比較
VBAにおける変数のメモリアドレスについて
・メモリアドレスを取得する関数とメモリコピーのWindowsAPI ・メモリアドレスを確認するために使用したVBA ・文字列型Stringのメモリアドレス ・Integer, Long, Single, Double, Dateのメモリアドレス ・Variantのメモリアドレス ・配列のメモリアドレス ・オブジェクトのメモリアドレス ・ByRef,ByValのメモリアドレス
Evaluateメソッド(文字列の数式を実行します)
・Evaluateメソッドの構文 ・Evaluateメソッドの解説と使用例 ・Evaluateメソッドの最後に
Rangeオブジェクトの論理演算(差集合と排他的論理和)
・集合について ・Rangeオブジェクトの論理演算のVBAについて ・和集合:Unionメソッド ・積集合:Intersectメソッド ・補集合 ・差集合 ・排他的論理和 ・Rangeオブジェクトの論理演算VBAの使い方とテスト
VBAで写真の撮影日時や音楽動画の長さを取得する
・VBAで写真の撮影日時を取得 ・全てのプロパティを取得するVBA ・全てのプロパティを取得するVBAの使用例 ・VBAで撮影日時や音楽動画の長さ取得の最後に
VBAでWindowsMediaPlayerを使い動画再生する
・ワークシートにWindowsMediaPlayerを事前に追加 ・ワークシートにWindowsMediaPlayerコントロールを動的に追加 ・ユーザーフォームにWindowsMediaPlayerを事前に追加 ・ユーザーフォームにWindowsMediaPlayerを動的に追加 ・簡単に動画再生するだけなら ・VBAでの動画再生の最後に
VBAでWEBカメラ操作する
・ActiveMovie Windowを起動する ・メインのユーザーフォーム ・WEBカメラを選択するユーザーフォーム ・上記ユーザーフォームの使い方 ・APIを使いキャプチャをとる ・VBAでWEBカメラ操作の最後に


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


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