• ベストアンサー

セルの頭の'を認識する方法について

数字を文字として入れたい場合など、頭にクォーテーションマークを付けて'001と入れますが、VBAでこのクォーテーションマークが入っていることを知るにはどのようにしたら良いでしょうか? '001の入っているセルを選択して下記VBAマクロを実行した場合、 Selection.Value Selection.Formula このどちらでも1しか返ってきません。 (数字でなくて文字列の場合も同様に'は無視されます) IsNumeric(Selection) でも数値として判定されます。 マクロの用途としては(1つ又は複数の)セルを選択し、ショートカットで+1したり-1する物を作ろうと思っています。 セルに'が入っていた場合、処理後も'が入ったままにします。 対象セルは色々なタイプでも可能にしようと思っています。 '0001 → '0002 '3/7 → '3/8 1 → 2 K-0005 → K-0006 よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

久しぶりの回答です。 下のようなことでしょうか。 変更するセル範囲を選択してマクロを実行します。その選択範囲の値を書き換えます。ご注意を。 PrefixCharacterよりも、テキスト部分に1を加算することが面倒なようです。 例えば、a99、a099に1を加算すると、2つともa100になるのでしょう。 で、a100から1を引こうとすると、結果をa99とa099のどちらにするか決めておく必要があるでしょう。 ユーザー定義関数の引数を変えれば、100を加算とかもできるでしょう。しかし、減算でマイナスになる場合は特に考慮していません。 この程度をチェックしました。       +1    -1  0001 → 0002 → 0001  3/7 → 3/8 → 3/7  1 → 2 → 1(数値)  K-0005 → K-0006 → K-0005  abc → abc → abc  a99b → a100b → a099b  a099b → a100b → a099b  '999 → '1000 → '0999  '0999 → '1000 → '0999  '00999 → '01000 → '00999  a10-001b → a10-002b → a10-001b  a10-999b → a10-1000b → a10-0999b  a10-0999b → a10-1000b → a10-0999b  999 → 1000 → 999(数値)  9999 → 10000 → 9999(数値) '// 1を加算 Sub add_1()   Dim rg As Range     '// セル   Dim rgText As String  '// セルのテキスト      For Each rg In Selection     rgText = rg.Text     If rg.PrefixCharacter = "'" Then       rg = "'" & fnTextAnd_X(rgText, 1)     Else       rg = fnTextAnd_X(rgText, 1)     End If   Next End Sub '// 1を減算 Sub sub_1()   Dim rg As Range     '// セル   Dim rgText As String  '// セルのテキスト      For Each rg In Selection     rgText = rg.Text     If rg.PrefixCharacter = "'" Then       rg = "'" & fnTextAnd_X(rgText, -1)     Else       rg = fnTextAnd_X(rgText, -1)     End If   Next End Sub '// 数値部分にxを加算して返す関数 Function fnTextAnd_X(ByVal tx As String, ByVal x As Integer)   Dim L1, L2 As Integer          '// カウンタ   Dim pStart As Integer, pEnd As Integer '// 対象数値の先頭,最後   Dim sNum As String           '// 対象数値   Dim strL As String, strR As String   '// 左右の部分   Dim nLen As Integer           '// 対象数値の長さ      For L1 = Len(tx) To 1 Step -1      '// 対象数値の最後を探す     If pStart = 0 And InStr("0123456789", Mid(tx, L1, 1)) Then       pEnd = L1       pStart = L1       For L2 = L1 To 1 Step -1     '// 対象数値の最初を探す         If InStr("0123456789", Mid(tx, L2, 1)) Then           pStart = L2         Else           Exit For         End If       Next     End If   Next      If pStart > 0 Then     sNum = Mid(tx, pStart, pEnd - pStart + 1)     strL = Left(tx, pStart - 1)    '// 左側     strR = Right(tx, Len(tx) - pEnd)  '// 右側          If x > 0 Then       nLen = Application.Max(Len(sNum), Len(Str(sNum + x)) - 1)     Else       nLen = Len(sNum)     End If     sNum = Right(String(nLen, "0") & (Val(sNum) + x), nLen)     fnTextAnd_X = strL & sNum & strR   Else     fnTextAnd_X = tx   End If End Function

believe_me
質問者

お礼

回答ありがとうございます。 私が作ったVBAマクロよりかなりスマートですね。 ほぼ同じロジックですが、マージセルが上手くいかなくて.MergeCellsや.MergeArea.Item(n)などを使って苦労しました。 ValueでなくTextにすべきだったんですね。 a100から1を引こうとすると、結果をa99とa099のどちらかにするか、これは決められないので、a099にしています。 とりあえずマイナスは必要ないので、ゼロ以下は計算しないようにしています。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

A1セルに'123 Cセルには表示形式を文字列にして123と入れて 下記を実行。 Sub test01() MsgBox Cells(1, 1) a = Cells(1, 1) MsgBox Mid(a, 1, 1) MsgBox Cells(1, 3).NumberFormat 'MsgBox Application.WorksheetFunction.cell("prefix", Range("A1")) MsgBox Range("A1").PrefixCharacter End Sub セルの文字列では (1)シングルクオーテーションつき (2)表示形式を文字列にして数字を入れる (3)他のアプリの文字列から 有るように思う。 (1)はMsgBox Range("A1").PrefixCharacter で捉えられました。 数式バーに’が出る (2)は@ 左詰に表示。 (3)は時々経験するように思うが、数式バー部に’が出なかったように記憶する?ロータス123の方式? このケースを今再現(思い出せない)できず、自信なし。 私も疑問に思っていた点だが、PrefixCharacterを発見。 本にはあまり解説を見ない。普通はVBAで使う必要なし。 Cell関数はWorkSheetFunctionでは使えないよう。

believe_me
質問者

お礼

回答ありがとうございます。 PrefixCharacterが使えるようですね。 エクセルVBAでできないことはほとんど無いと思いますが、どこをどう探せば見つかるか未だにわかりません。

関連するQ&A