[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル内の文字列の操作』(サファ者)
IC1,IC2,IC3,IC4,IC6,IC8,IC10,IC11,IC12,IC14
この文字列を
IC1~4,6,8,10~12,14
のように変換させたいです。
内容なのですが、
・ローマ字の部分ICを先頭だけを残して削除
・3つ以上の連番は「~」を使って表す
よろしくお願いします
2003
>・3つ以上の連番は「~」を使って表す
2つ連番なら?
それと、関数で?
(ぶらっと)
2,3,11はいらないのですか。
マクロでお願いします。
2,3,11は
例えば
1~4は1から4までという意味で表すように考えていますので、
見た目で言うといらないです。
(サファ者)
すこ〜し、力技になったけど。 たとえば文字列がA1にあるとして。
Sub Sample()
Dim v As Variant
Dim s As String
Dim f As Long
Dim t As Long
Dim i As Long
Dim w() As String
Dim k As Long
Dim x As Long
s = Range("A1").Value & "," 'たとえば"
v = Split(Replace(s, "IC", ""), ",")
ReDim w(1 To UBound(v))
f = LBound(v)
For i = LBound(v) To UBound(v) - 1
If Val(v(i)) + 1 <> Val(v(i + 1)) Then
If i - f > 1 Then
k = k + 1
w(k) = v(f) & "~" & v(i)
Else
For x = f To i
k = k + 1
w(k) = v(x)
Next
End If
f = i + 1
End If
Next
ReDim Preserve w(1 To k)
MsgBox Join(w, ",")
End Sub
Sub test()
Dim cw As String
Dim vw As Variant
Dim i As Long
Dim iFlag As Long
Dim iw1 As Long
Dim iw2 As Long
vw = Split(Range("A1"), ",")
cw = vw(0)
iw2 = Mid(cw, 3)
iFlag = 0
For i = 1 To UBound(vw)
If 0 < iFlag Then
iw1 = iw1 + 1
Else
iw1 = iw2 + 1
End If
iw2 = Mid(vw(i), 3)
If iw1 = iw2 Then
iFlag = iFlag + 1
Else
If iFlag = 1 Then
cw = cw & "," & (iw1 - 1) & "," & iw2
ElseIf 1 < iFlag Then
cw = cw & "~" & (iw1 - 1) & "," & iw2
Else
cw = cw & "," & iw2
End If
iFlag = 0
End If
Next i
If iFlag = 1 Then
cw = cw & "," & iw2
ElseIf 1 < iFlag Then
cw = cw & "~" & iw2
End If
MsgBox cw
End Sub
(???) 若干修正。
説明がたりなかったのですが
同じ列に
IC1,IC2,IC3,IC4,IC6,IC8,IC10,IC11,IC12,IC14
R3,R4,R8,R9,R10,R13
ZNR6,ZNR9,ZNR10,ZNR11,ZNR12
のように文字列がありまして、それを一括でマクロで下記のように変換できるようにしたいです。
IC1~4,6,8,10~12,14
R3,4,8~10,13
ZNR6,9,10~12
お願いします。(サファ者)
>メッセージボックスに表示ではなく、変換希望です。
それはわかっていたけど、そのあたりは、そちらで応用で、セルに書き込んでくれたらいいので・・・
>のように文字列がありまして
つまり、それぞれの行での アルファベット が異なるということだね?
(ぶらっと)
応用してみます。
それぞれの行でアルファベットは異なります。
ありがとうございました。
(サファ者)
書いたので参考出品。
Sub Sample2()
Dim v As Variant
Dim s As String
Dim f As Long
Dim t As Long
Dim i As Long
Dim w() As String
Dim k As Long
Dim x As Long
Dim c As Range
Dim re As Object
Dim mt As Object
Dim prefix As String
Application.ScreenUpdating = False
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[A-Z]+"
For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
s = c.Value & ","
prefix = re.Execute(s).Item(0).Value
v = Split(Replace(s, prefix, ""), ",")
ReDim w(1 To UBound(v))
k = 0
f = LBound(v)
For i = LBound(v) To UBound(v) - 1
If Val(v(i)) + 1 <> Val(v(i + 1)) Then
If i - f > 1 Then
k = k + 1
w(k) = v(f) & "~" & v(i)
Else
For x = f To i
k = k + 1
w(k) = v(x)
Next
End If
f = i + 1
End If
Next
ReDim Preserve w(1 To k)
c.Value = prefix & Join(w, ",")
Next
Application.ScreenUpdating = True
End Sub
(ぶらっと)
Sub test()
Dim cw As String
Dim vw As Variant
Dim i As Long
Dim iR As Long
Dim iFlag As Long
Dim iw1 As Long
Dim iw2 As Long
For iR = 1 To Cells(Rows.Count, "A").End(xlUp).Row
vw = Split(Cells(iR, "A").Value, ",")
cw = vw(0)
iw2 = Fix(StrReverse(Val(StrReverse(vw(0) & "9"))) / 10)
iFlag = 0
For i = 1 To UBound(vw)
If 0 < iFlag Then
iw1 = iw1 + 1
Else
iw1 = iw2 + 1
End If
iw2 = Fix(StrReverse(Val(StrReverse(vw(i) & "9"))) / 10)
If iw1 = iw2 Then
iFlag = iFlag + 1
Else
If iFlag = 1 Then
cw = cw & "," & (iw1 - 1) & "," & iw2
ElseIf 1 < iFlag Then
cw = cw & "~" & (iw1 - 1) & "," & iw2
Else
cw = cw & "," & iw2
End If
iFlag = 0
End If
Next i
If iFlag = 1 Then
cw = cw & "," & iw2
ElseIf 1 < iFlag Then
cw = cw & "~" & iw2
End If
Cells(iR, "B").Value = cw
Next iR
End Sub
(???)
こんな感じで
Sub test()
Dim a, i As Long
With Range("a1", Range("a" & Rows.Count).End(xlUp)).Resize(, 2)
a = .Value
For i = 1 To UBound(a, 1)
a(i, 2) = Summarize(a(i, 1))
' a(i, 2) を a(i, 1) に変更すると A列を変換
Next
.Value = a
End With
End Sub
Function Summarize(ByVal txt As String) As String
Dim temp As String, m As Object, flg As Boolean, i As Long
Summarize = txt
If txt Like "*[!A-Za-z0-9, ]*" Then Exit Function
With CreateObject("VBScript.RegExp")
.Pattern = "((\D+)(\d+,)+)\2(.*)"
temp = .Replace(txt, "$2")
Do While .test(txt)
txt = .Replace(txt, "$1$4")
Loop
.Global = True
.Pattern = "\d+"
Set m = .Execute(txt)
If m.Count > 1 Then
temp = temp & m(0)
For i = 1 To m.Count - 1
If Val(m(i)) - Val(m(i - 1)) <> 1 Then
If flg Then
temp = temp & m(i - 1) & "," & m(i): flg = False
Else
temp = temp & "," & m(i)
End If
Else
If Not flg Then
temp = temp & "~": flg = True
End If
End If
Next
End If
End With
Summarize = temp
End Function
(seiya) チョイ修正 20:47
ぶらっとさんのコードだとおそらく、下から4行目のprefixの部分に手を
加えればよさそうだと思うのですが、何を入れたらいいのかわかりません。
再度ご教授お願い致します。
c.Value = prefix & Join(w, ",")
サファ者
Sub test()
Dim cw As String
Dim vw As Variant
Dim i As Long
Dim iR As Long
Dim iFlag As Long
Dim iw1 As Long
Dim iw2 As Long
For iR = 1 To Cells(Rows.Count, "A").End(xlUp).Row
vw = Split(Cells(iR, "A").Value, ",")
cw = vw(0)
iw2 = Fix(StrReverse(Val(StrReverse(vw(0) & "9"))) / 10)
iFlag = 0
For i = 1 To UBound(vw)
If 0 < iFlag Then
iw1 = iw1 + 1
Else
iw1 = iw2 + 1
End If
iw2 = Fix(StrReverse(Val(StrReverse(vw(i) & "9"))) / 10)
If iw1 = iw2 Then
iFlag = iFlag + 1
Else
If iFlag = 1 Then
cw = cw & "," & vw(i - 1) & "," & vw(i)
ElseIf 1 < iFlag Then
cw = cw & "~" & (iw1 - 1) & "," & vw(i)
Else
cw = cw & "," & vw(i)
End If
iFlag = 0
End If
Next i
If iFlag = 1 Then
cw = cw & "," & vw(i - 1)
ElseIf 1 < iFlag Then
cw = cw & "~" & iw2
End If
Cells(iR, "B").Value = cw
Next iR
End Sub
(???)
Sample2 でいえば
c.Value = prefix & Join(w, ",")
これを
c.Value = prefix & Join(w, "," & prefix)
(ぶらっと)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.