No.1ベストアンサー
- 回答日時:
こんにちは
通常の関数でやろうとすると、文字列の解析とエラーチェックで大変なことになりそうなので、ユーザ定義関数にしてみました。
ユーザ定義関数にしても、何でもありというわけにはいかないので、以下の条件を設けています
【 条件 】
・セパレターは半角英数の-(マイナス記号)です(似た字が他にもあるのでご注意)
・文字列部分は前半分のものを無条件で採用(後半と合致しているかのチェックはしません)
・数値は自然数のみ(負数や実数は別の解釈をされます)
・数値はLongで対応できる範囲に限定
・前半の数値から後半の数値へ1ずつ変化(昇順・降順とも対応)
・指示の文字列がブランクだったり、番号が範囲外の場合は空白文字列を返します。
【 書式 】
=serialString(指示文字列, 番号)
・指示文字列は、ご質問文の「A1-A5」に相当する文字列を意味します
・番号は自然数で、A1-A5が示す内容の何番目の数値かを意味します
(例えば、=serialString("A1-A5",3)はA3を返します)
添付図は、適当な指示文字列をA列に並べておいて、C1セルに
=serialString($A1,COLUMN(A1))
の式を入れて、画面の着色範囲にフィルコピーした例です。
【 ユーザ定義関数 】
Function serialString(ByVal t As String, ByVal n As Long) As Variant
Dim RE As Object, Mtc As Object, r, s
Dim pre As String, n1 As Long, n2 As Long, d As Integer
serialString = ""
If t = "" Then Exit Function
Set RE = CreateObject("VBScript.RegExp")
RE.Pattern = "\d+$"
s = Split(t, "-")
If UBound(s) - LBound(s) <> 1 Then
r = CVErr(xlErrNA)
Else
n1 = RE.Execute(s(LBound(s)))(0)
pre = RE.Replace(s(LBound(s)), "")
n2 = RE.Execute(s(UBound(s)))(0)
If n1 <= n2 Then d = 1 Else d = -1
If n < 1 Or n > Abs(n2 - n1) + 1 Then
r = ""
Else
r = pre & CLng(n1 + d * (n - 1))
End If
End If
serialString = r
End Function
この回答へのお礼
お礼日時:2018/02/04 08:38
fujillinさん
すごくご丁寧に教えていただき、ありがとうございました!
教えていただいた方法で一度挑戦してみたいと思います。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Excel(エクセル) エクセルのことで教えてください。 A1セルに、 別シートのA1セルが1のときは「A」、2のときは「B 4 2023/02/24 23:08
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Visual Basic(VBA) if関数とifs関数は組み合わせることはできますか。 セルA1が「A」のとき「向日葵」と表示。 セル 4 2023/02/02 20:48
- Excel(エクセル) 【Excel関数】値が合致するセルの隣のセルを表示させたい 8 2022/10/12 17:44
- Excel(エクセル) エクセルを活用した受注表作成の中で関数・数式を教えてください。 3 2022/07/23 08:14
- Excel(エクセル) エクセルマクロ セルをクリックするたびに記号を入力 1 2022/10/13 19:47
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 17:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
[C言語]fputsとfprintfの違い
-
VBの「As String * 128」とは?
-
VBscriptからバッチに変数を渡...
-
MS SQLServer のSQLで文字列の...
-
Excelはなんで先頭の0を消すん...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
A B C D E の五文字のすべてを...
-
ORCLEでの小数の表示方法の変更...
-
エクセルで文字列の最大値を抽...
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
sedなどで、特定の文字列の後の...
-
Excelで指数表現しないようにす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
[C言語]fputsとfprintfの違い
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
Excelはなんで先頭の0を消すん...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
sedなどで、特定の文字列の後の...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
おすすめ情報