- ベストアンサー
セルの頭の'を認識する方法について
数字を文字として入れたい場合など、頭にクォーテーションマークを付けて'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 よろしくお願い申し上げます。
- みんなの回答 (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
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
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では使えないよう。
お礼
回答ありがとうございます。 PrefixCharacterが使えるようですね。 エクセルVBAでできないことはほとんど無いと思いますが、どこをどう探せば見つかるか未だにわかりません。
お礼
回答ありがとうございます。 私が作ったVBAマクロよりかなりスマートですね。 ほぼ同じロジックですが、マージセルが上手くいかなくて.MergeCellsや.MergeArea.Item(n)などを使って苦労しました。 ValueでなくTextにすべきだったんですね。 a100から1を引こうとすると、結果をa99とa099のどちらかにするか、これは決められないので、a099にしています。 とりあえずマイナスは必要ないので、ゼロ以下は計算しないようにしています。