アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル関数でできるかどうか教えてください。

例えば下記のような続き番号が1つのセルの中に表示されている場合

A1- A5

これを、別のシートにA1,A2,A3,A4,A5と表示させたいのですが、どなたかご存知の方いらっしゃれば教えて下さい。

よろしくおねがいします(o^^o)

A 回答 (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
「エクセル関数でできるかどうか教えてくださ」の回答画像1
    • good
    • 1
この回答へのお礼

fujillinさん

すごくご丁寧に教えていただき、ありがとうございました!
教えていただいた方法で一度挑戦してみたいと思います。
本当にありがとうございました!

お礼日時:2018/02/04 08:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!