• 締切済み

エクセルVBAの文字列操作について2

エクセルVBAの文字列操作について2 以前、こちらでご教授いただいた以下のような文字列操作方法があります。 この方法ですと例えば[1-3]から3をひいた際に"1-2"と表示されますが 今回は連続する数字が2つの場合は1,2と表示させ3つ以上の場合は-でつないで表示させたいと思います。 一週間ほど考えたのですが解決できませんでした。 どなたかご協力お願いいたします。 質問内容 例えば、[1-10,15-20,22-38]と入っているセルがあるとします。 このセルに数を足したり引いたりしたいのです。 例えば、このセルから”5”を引いて[1-4,6-10,15-20,22-38]と表示したり、 "21"を足して[1-10,15-38]と表示したい。 いただいたご回答  A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに =NUMORDER(A1,-5) と入力すると「1-4,6-10,12,15-20,22-38」と表示し =NUMORDER(A1,21) と入力すると「1-10,12,15-38」と表示します。  1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。 Function NUMORDER(myStr As Variant, num As Integer) As String  Dim i As Long  Dim j As Double  Dim myNum As Variant   '文字列中の スペース を削除  myStr = Replace(myStr, " ", "")   '文字列の前後に「0」・「100」を挿入  Select Case Left(myStr, 2)   Case "1,", "1-"    myStr = myStr & ",100"   Case Else    myStr = "0," & myStr & ",100"  End Select   '文字列を カンマ で分割し、ハイフン の区間の数字を補完する  myStr = Split(myStr, ",")  For i = 0 To UBound(myStr)   If InStr(myStr(i), "-") > 0 Then    myNum = Split(myStr(i), "-")    myStr(i) = ""    For j = myNum(0) To myNum(1)     myStr(i) = myStr(i) & " " & j    Next    myStr(i) = Trim(myStr(i))   End If  Next   '欠番に「●」を入れ、「数を足したり引いたり」する  myStr = Split(Join(myStr))  For i = 0 To UBound(myStr) - 1   myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)  Next  myStr = Split(Join(myStr))  If num > 0 Then   myStr(num - myStr(0)) = num  Else   myStr(-num - myStr(0)) = "●"  End If   '前後に挿入した「0」・「100」を削除  myStr = Replace(Join(myStr), " 100", "")  If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)   '連続数字を ハイフン で繋ぐ  myStr = Split(myStr, "●")  For i = 0 To UBound(myStr)   If myStr(i) <> " " Then   myNum = Split(Trim(myStr(i)))    If UBound(myNum) > 0 Then     myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))    End If   End If  Next   'カンマ で文字列に分割する  myStr = Application.Trim(Join(myStr))  NUMORDER = Replace(myStr, " ", ",") End Function

noname#150547
noname#150547

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#4のコードですが、 >A1:[1-10,15-20,22-38] >=SerialLinker(A1,-39) >1-4,6-10,15-20,22-38 そのような結果にはならないはずです。 A1:[1-10,15-20,22-38] =SerialLinker(A1,-39) 結果:1-10,15-20,22-38 となります。 ** >1-4,6-10,15-20,22-38 とするには、 =SerialLinker(A1,-5) となります。 >のような形ですと全て削除されてしまうようです。 こちらで試してみましたが、そのようなことはありませんね。間違った入力をすれば、概ね、#VALUE!エラーが発生するはすです。どうすれば、すべて削除されるのですか?VBAプロシージャから使わないと、削除されることはないはずです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#2の回答者です。 前のパラメータ配列(複数の引数)で行ったほうがよいとは思うのですが、理解出来ていないようなので、以下のように変更しました。数のダブリを抜くコードは入れました。扱いは正数に限ります。 A1:[1-10,15-20,22-38] =SerialLinker(A1,-5) 1-4,6-10,15-20,22-38 =SerialLinker(A1,21) 1-10,15-38 =SerialLinker(A1,-3) 1,2,4-10,15-20,22-38 '// Public Function SerialLinker(ByVal Nums As Variant, arg As Variant) Dim arNum, arTmp, Ar() As Long, Ar2() As Long Dim i As Long, j As Long, m As Long, k As Long Dim n As Variant, a As Long, b As Long Dim buf As String, flg As Boolean If IsNumeric(Nums) Then Exit Function Nums = StrConv(Nums, vbNarrow) If Nums Like "[[]#*" Then   Nums = Mid(Nums, 2, Len(Nums) - 2) End If arNum = Split(Nums, ",") For Each n In arNum   If InStr(n, "-") Then     arTmp = Split(n, "-")     If arTmp(1) > arTmp(0) Then       a = arTmp(0): b = arTmp(1)     Else       a = arTmp(1): b = arTmp(0)     End If     For i = a To b       ReDim Preserve Ar(j)       Ar(j) = i       j = j + 1     Next   Else     ReDim Preserve Ar(j)     Ar(j) = n     j = j + 1   End If Next n ReDim Preserve Ar(j) Ar(j) = Abs(arg) ReDim Ar2(UBound(Ar)) If arg >= 0 Then   k = 0   For i = LBound(Ar) To UBound(Ar)      Ar2(i) = Application.Small(Ar, i + 1)   Next   For i = LBound(Ar2) To UBound(Ar2)      If i < UBound(Ar2) Then       If Ar2(i) <> Ar2(i + 1) Then        Ar2(k) = Ar2(i)        k = k + 1       End If      Else       Ar2(k) = Ar2(i)      End If   Next Else   j = 0   For i = LBound(Ar) To UBound(Ar) - 1     If Ar(i) <> Abs(arg) Then       Ar2(j) = Ar(i)       j = j + 1     End If   Next   ReDim Preserve Ar2(j - 1) End If buf = Ar2(0) j = UBound(Ar2) For i = 1 To j   If Ar2(i) = Ar2(i - 1) + 1 Then     flg = True: m = m + 1   ElseIf flg Then     If m = 1 Then       buf = buf & "," & Ar2(i - 1) & "," & Ar2(i)     Else       buf = buf & "-" & Ar2(i - 1) & "," & Ar2(i)     End If     flg = False: m = 0   ElseIf Ar2(i) <> Ar2(i - 1) Then     buf = buf & "," & Ar2(i)     flg = False   End If Next If flg Then buf = buf & "-" & Ar2(i - 1) SerialLinker = buf End Function

noname#150547
質問者

お礼

見事に連続数字が処理されていますね。 半分程しかコードが理解出来なかったので 勉強させていただきます。 ただ、 A1:[1-10,15-20,22-38] =SerialLinker(A1,-39) 1-4,6-10,15-20,22-38 のような形ですと全て削除されてしまうようです。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

プログラムがやや複雑になっていると思い、多少シンプル?に作成してみました。 配列を文字列にして「1」「0」の位置で数値の有無を表わしています。 その他はプログラムを見て理解して下さい。 Function NUMORDER(ByVal myStr As Variant, num As Integer) As String  Dim I    As Integer  Dim J    As Integer  Dim 開始値  As Integer  Dim 終了値  As Integer  Dim 数列   As String  Dim K区切り As Variant  Dim H区切り As Variant  数列 = String(101, "0")  K区切り = Split(myStr, ",")  For I = 0 To UBound(K区切り)   H区切り = Split(K区切り(I), "-")   開始値 = H区切り(0)   終了値 = H区切り(UBound(H区切り))   For J = 開始値 To 終了値    Mid(数列, J, 1) = "1"   Next J  Next I  If num > 0 Then Mid(数列, num, 1) = "1"  If num < 0 Then Mid(数列, -num, 1) = "0"  I = 1  Do   I = InStr(I, 数列, "1")   If I <= 0 Then Exit Do   If NUMORDER <> "" Then NUMORDER = NUMORDER & ","   J = InStr(I, 数列, "0")   NUMORDER = NUMORDER & I   If I <> (J - 1) Then NUMORDER = NUMORDER & "-" & J - 1   I = J  Loop End Function

noname#150547
質問者

お礼

すばらしい!ここまでまとめられるものなのですね。 勉強させていただきます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

前回のようにお礼もコメントも書かないで締めるのはマナーに関わります。点は、あくまでも、OkWaveの決め事であって、点はお礼の代わりにはなりません。 私の関数は、加える・引くが同じ関数で出来ることと、複数の引数が可能です。 =SerialChecker(A1,FALSE, 5) 引く または、=SerialChecker(A1,0, 5) =SerialChecker(A1,TRUE, 5) 足す または、=SerialChecker(A1,1, 5) 文字制限のために、以下はVBAの書法を守っていませんが、これは便宜的なものです。 '// Public Function SerialChecker(ByVal Nums As Variant, EraseFlg As Boolean, ParamArray AddVal()) Dim arNum, arTmp, Ar() As Long, Ar2() As Long Dim i As Long, j As Long, k As Long, m As Long Dim n, c, ret, a As Long, b As Long Dim arBuf, buf As String, flg As Boolean If IsNumeric(Nums) Then Exit Function Nums = StrConv(Nums, vbNarrow) If Nums Like "[[]#*" Then   Nums = Mid(Nums, 2, Len(Nums) - 2) End If arNum = Split(Nums, ",") For Each n In arNum   If InStr(n, "-") Then     arTmp = Split(n, "-")     If arTmp(1) > arTmp(0) Then       a = arTmp(0): b = arTmp(1)     Else       a = arTmp(1): b = arTmp(0)     End If     For i = a To b       ReDim Preserve Ar(j)       Ar(j) = i       j = j + 1     Next   Else     ReDim Preserve Ar(j)     Ar(j) = n     j = j + 1   End If Next n If IsArray(AddVal) Then   arBuf = Array(AddVal) End If If EraseFlg Then 'Add   For Each c In AddVal     ReDim Preserve Ar(j)     Ar(j) = c     j = j + 1   Next   ReDim Ar2(j - 1)   For i = 0 To j - 1     Ar2(i) = Application.Small(Ar, i + 1)   Next Else   j = 0   For Each c In Ar     ret = Application.Match(c, arBuf, 0)     If IsError(ret) Then       ReDim Preserve Ar2(j)       Ar2(j) = c       j = j + 1     End If   Next   For i = 0 To j - 1     Ar2(i) = Application.Small(Ar2, i + 1)   Next End If buf = Ar2(0) For i = 1 To j - 1   If Ar2(i) = Ar2(i - 1) + 1 Then     flg = True: m = m + 1   ElseIf flg Then     If m = 1 Then       buf = buf & "," & Ar2(i - 1) & "," & Ar2(i)     Else      buf = buf & "-" & Ar2(i - 1) & "," & Ar2(i)     End If     flg = False: m = 0   ElseIf Ar2(i) <> Ar2(i - 1) Then     buf = buf & "," & Ar2(i)     flg = False   End If Next If flg Then buf = buf & "-" & Ar2(i - 1) SerialChecker = buf End Function

noname#150547
質問者

お礼

ご指摘に感謝致します。 複数の引数で行えるのですね。勉強させていただきます。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

"1-2"のところを"1,2"ですから、 NUMORDERの結果からさらに、 開始-終了の差が1しかない(連続している)を判定できれば OKということでしょうか?。 「-」を見つけて前の数値後の数値を比較・・・、 また「-」を見つけて比較・・・、の繰り返し?。 前回の対応者に聞くのが早いと思いますが・・・。 '連続数字を ハイフン で繋ぐ の myStr(i) = myNum(0) & "-" & myNum(UBound(myNum)) 付近と思われます。

noname#150547
質問者

補足

ご指摘のように「-」を見つけて前の数値後の数値を比較・・・ ということを考えて以下のようなコードを考えていましたが かなり長くなったのでもっとスマートにやる方法はないかと思った次第です。 全体 = Len(NUMORDER) ハイフン除いた数 = Replace(NUMORDER, "-", "") ハイフン個数 = 全体 - Len(ハイフン除いた数) ハイフンの位置 = InStr(NUMORDER, "-") If ハイフンの位置 > 0 Then Else GoTo label900 End If NUMORDER = "," & NUMORDER & "," ハイフンの位置 = InStr(NUMORDER, "-") Do Until ハイフンの位置 < 1 If ハイフンの位置 > 0 Then ハイフンの左の位置 = ハイフンの位置 - 1 ハイフンの左 = Mid(NUMORDER, ハイフンの位置 - 1, 1) ハイフンの右 = Mid(NUMORDER, ハイフンの位置 + 1, 1) 左1 = Mid(NUMORDER, ハイフンの位置 - 2, 1) 右1 = Mid(NUMORDER, ハイフンの位置 + 2, 1) If 左1 = "," Then ハイフンの左 = Mid(NUMORDER, ハイフンの位置 - 1, 1) Else ハイフンの左 = Mid(NUMORDER, ハイフンの位置 - 2, 2) End If If 右1 = "," Then ハイフンの右 = Mid(NUMORDER, ハイフンの位置 + 1, 1) Else ハイフンの右 = Mid(NUMORDER, ハイフンの位置 + 1, 2) End If If ハイフンの左 + 1 = ハイフンの右 Then Mid(NUMORDER, ハイフンの位置, 1) = "," End If End If ggg = InStr(NUMORDER, "-") ハイフンカウント = ハイフンカウント + 1 If ハイフン個数 = ハイフンカウント Then Exit Do End If If ggg = 0 Then Exit Do End If ハイフンの位置 = InStr(ハイフンの位置 + 1, NUMORDER, "-") Loop 総数 = Len(NUMORDER) NUMORDER = Mid(NUMORDER, 2, 総数 - 2) label900:

関連するQ&A

  • VBA、Excel、文字列の置換について

    エクセルのVBAを勉強しているものなのですが 行き詰ってしまったので有識者の方、アドバイスをお願いします 目的:セルに入力されているカンマで区切られた文字列(例、1,2,5,6,7,8,10,11・・・)で連番の場合間の数字を"-"で省略(例、1,2,5-8,10,11・・・)する関数の作成 以下、プログラム (1)カンマで区切られた文字列をスプリットし、配列化 For Each cl In moji myData = Split(cl, ",") Next (2)3つ以上の連番の場合、"-"で文字列の短縮化 For l = 1 To UBound(myData) If myData(l) = myData(l + 1) - 1 Then If myData(l) = myData(l - 1) + 1 Then myData(l) = "-" ElseIf myData(l) = "-" Then myData(l) = "" Else myData(l) = myData(l) & "," End If Else myData(l) = myData(l) & "," End If Next l (3)配列をカンマで区切られた文字列として出力 For m = 0 To UBound(myData) bunkai = bunkai & myData(m) Next m

  • 【エクセルvba】(1)(2)(3)を区切りとして分けたい 配列

    こんばんは。 もしエクセルで可能なら教えていただきたいです。(2003です) A1セルに (1)りんご(2)みかん(3)バナナ と入力されています。 これを A2にりんご、B2にみかん、C2にバナナ とSplitと使って区切りたいのですが不可能でしょうか? 以下がここのサイトを参考にして作ったサンプルマクロです。 Sub サンプル() Dim myStr As String Dim ar As Variant myStr = Cells(1, 1) ar = Split(myStr, "") '←この部分をどうすればいいのかわからない Cells(2, 1).Resize(1, UBound(ar) + 1).Value = ar End Sub やはり、区切る文字が複数ある場合は不可能でしょうか? ご教授よろしくお願いします。

  • エクセルVBAで任意の文字列を抽出するには・・・

    エクセル2003で作成した住所録があります。 県名(3文字)のみを抽出して、新たに設けたD列に表示させたいと考えています。 Sub 県名の列作成()  Dim myStr As String  myStr = ActiveCell.Value  Range("D2").Value = Left(myStr,3) End Sub ここまで、できたのですが・・・・ B列の2行目から順に処理をして、一覧表の最後まで行って、 空白セルの行が見つかったら終了させる方法が分かりません。 どうかよろしくお願いします。

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • VBA 文字列に関して

    現在 A22のセルに入力された文字列をボタンを押せば ばらばらにしてA22のセルから順番に入れるマクロを作りました (例)A22のセルに ”こんにちわ”の文字列が入っている場合 ボタン押下   ↓ A22のセル⇒こ B22のセル⇒ん C22のセル⇒に D22のセル⇒ち E22のセル⇒わ になる。 不思議なことに数字を16文字以上いれてボタンを押し文字を分離すると入力していない文字、数字が入ってしまいます。 数字だけこういう現象が発生してしまいます。 例えば "1111111111111111"と入力して文字を分離した場合 1.11111111111111E+15と個々のセルに格納されます。 原因がわかる方、教えて頂けないでしょうか? 以下がコードです。宜しくお願い致します。 Private Sub CommandButton1_Click()   Dim one As String   Dim myString As String   myString = Cells(22, 1)   numString = Len(Cells(22, 1))   If Len(myString) <= 50 Then    For i = 1 To Len(Range("A22").Value)      one = String(1, myString)      Cells(22, i) = one      myString = Replace(myString, one, "", 1, 1, vbTextCompare)    Next i   End If End Sub

  • エクセルVBAでセル内の特定文字列を太字に

    エクセル2003です。 A2からA100の範囲のすべてのセルに文字列(文章)が入っています。 セルにより、約30~1200文字程度とばらばらです。 この範囲の各セルの文字列の中に、「愛、恋、幸福、love」という文字列があれば、その語句だけを太字にしたいのです。 (なければ、なにもしません。) 英字(love)は半角全角大文字小文字を問いません。 一応、ここまでは書いたのですが、検索するところでお手上げになってしまいました。 なにとぞ、お助けください。 Sub Test() Dim myW Dim i As Long myW = Split("愛,恋,幸福,love", ",") For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row For n = LBound(myW) To UBound(myW) MsgBox Cells(i, "A").Value & "に" & myW(n) & "があれば太字に" 'この肝心な部分がわかりません。 Next n Next i End Sub

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • エクセルVBAで、文字列の検索方法について

    先日、こちらで教えていただいたVBAがあります。 E列のセルの文字列の末尾が「計」のものを検索し、その行に色をつけるものです。 Sub iroiro() Dim x, y x = 1 Do If Right(Cells(x, 5), 1) = "計" Then For i = 2 To 5 Cells(x, i).Interior.ColorIndex = 3 Next End If x = x + 1 Loop Until Right(Cells(x, 5), 1) = "" End Sub これはばっちりで、助かっているのですが、今度は末尾ではなく、文字列中に「営業」という文字があるのを検索し、色をつけたいのです。 If Right(Cells(x, 5), 1) = "計" Thenを どう変えればいいのでしょうか?

  • エクセルマクロで、書式が違っても文字列を評価する方法

    文字列書式のセルと、標準書式のセルの数字文字列を比較したいのですが、うまくいきません。 書式が違うと、range.textも違う値になってしまうようです。 結局、現状では一度文字列変数の中に一度いれてから処理していますが、もっと他によい方法はないでしょうか? ------------------------------- If range1 = range2 Then  ・・・・・ End If ------------------------------- Dim temp1 As String Dim temp2 As String If temp1 = temp2 Then ・・・・・・ end If ------------------------------

  • VBA 指定文字列が出てきたら、左の文字は削除する

    お世話になっております。 Excel2003を使用しております。 指定文字列が出てきたら、左にある文字は全て削除したいと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「名前:より左は削除」 名前: 佐藤 太郎   趣味:散歩 また、出来たら指定文字列より右にあるものも削除できたら良いなと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「趣味:より右は削除」 番号:0001  名前: 佐藤 太郎 色々試してみています。 今後もたくさんのプログラムに使っていくことも考え、配列に入れることも考えています。 LeftDeleteMoji=Array("名前:") RightDeleteMoji=Array("趣味:") やりたいこととしては、                 (例)番号:0001  名前: 佐藤 太郎   趣味:散歩 左から指定文字列手前まで抜き出す とか    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す とか       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す とか (例)「名前:,趣味:」名前: 佐藤 太郎 があります。 A列を上から順番に行っていき、 必要ない部分はスルーして、必要な部分のみ抜き出し、 別シートに書き込む。 これを行おうと思っています。 If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 then で文字列が含まれているか確認していたのですが、 配列の設定方法なのか、色々良く分からなくなってしまいまいました。 -------------------------------現在のプログラム NeedData = Array("", "名前:", "名前:", "趣味:") For i = 1 To MaxRow '重要データ保存 If Num > UBound(NeedData) Then Num = 0 End If If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 Then '含む場合の動作 If NeedData(Num) = "" Then If InStr(.Range("A" & i).Value, NeedData(Num + 1)) > 0 Then EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Left(.Range("A" & i).Value, EndData - 1) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If Else StartData = InStr(.Range("A" & i).Value, NeedData(Num)) + Len(NeedData(Num)) EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Mid(.Range("A" & i).Value, StartData, EndData) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If End If Next ーーーーーーーーーーー------------------- 入力されているデータ(元のデータ)は決まりごとがあり、 必ずその文字データはあります。(順番も合っています) 上記プログラムは、配列が空白だったら、配列の2個目を検索して 右にある必要の無いデータは削除する。 そのような流れにしようと思っていました。 話がそれましたが、もっと良い(分かりやすい)プログラム方法がある気がします。 現状、一応完成?というところまできては居ますが、 もし、失敗した場合、どこが原因がハッキリしない感じになってしまっています。 左から指定文字列手前まで抜き出す    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す (例)「名前:,趣味:」名前: 佐藤 太郎 良い方法があれば教えて下さい! よろしくお願い致します!

専門家に質問してみよう