[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA:文字列の分割&まとめる』(わからず)
仕事でいきずまってしまいました。どなたか良いご回答お願いします。
<したいこと>
A B 1 A1-3,5,AB1-5 2 R1-5,7,9,C5,FL1-5 ・ ・ ・ ・ ・ ・
とゆーよーなデータがずらっとありこのデータを
A B 1 A1-3,5 1.01 AB1-5 2 R1-5,7,9 2.01 C5 2.02 FL1-5
となるように作成したいのですが、現在のコードでは
A B 1 A1-3,5 1.01 A1-5 2 R1-5,7,9 2.01 R5 2.02 R1-5
と表示されてしまいます。コードをのせますので、良いアドバイスをお願いします。
※B列のデータはもっと長いのもあれば、短いのもありとさまざまです。
Range("A2").Select
Do While ActiveCell <> ""
Selection.Offset(0, 1).Select
roke = ActiveCell.Value
Nagasa = Len(roke)
Mijissou = "": MijissouL = "": MijissouR = ""
For i = 2 To Nagasa
If Val(Right(Left(roke, i), 1)) <> 0 Then Exit For
Next
Kategori = Left(roke, i - 1)
If Left(roke, 1) = "<" Then _
Mijissou = "<": MijissouL = "<": MijissouR = ">"
If Nagasa >= 40 Then
Selection.Offset(0, -1).Select
Koumoku = ActiveCell.Value
Koumoku = Koumoku + 0.01
Selection.Offset(1, 0).Select
ActiveWindow.SmallScroll Down:=1 '行の追加
Selection.EntireRow.Insert '行の追加
ActiveCell.Value = Koumoku '項目の追加(例:53.1)
For i = 0 To 37
A = Left(roke, 38 - i)
B = Right(A, 1)
If B = "," Then Exit For
Next
Selection.Offset(-1, 1).Select
If Left(Left(roke, 38 - i - 1), 1) = "<" Then MijissouL = ""
If Right(Left(roke, 38 - i - 1), 1) = ">" Then MijissouR = ""
ActiveCell.Value = MijissouL & Left(roke, 38 - i - 1) & MijissouR
roke = Right(roke, Nagasa - 38 + i)
Selection.Offset(1, 0).Select
ActiveCell.Value = Kategori & roke
Selection.Offset(-1, 0).Select
End If
Selection.Offset(1, -1).Select
Loop
ご教授よろしくお願いします。
見づらかったので、勝手に修正〜
(ramrun)
上のコードで上のデータですと、わからずさんがいうような 結果になりませんね。 コードを読んでみても、そういう結果以前にいろいろあるんですけど それは置いといて。
とりあえずMijissouの扱いが不明ですが、 極力、わからずさんのコードを残す形で修正してみました。 (ramrun)
Sub macro()
Range("A2").Select
Do While ActiveCell <> ""
Selection.Offset(0, 1).Select
roke = ActiveCell.Value
Nagasa = Len(roke)
MijissouL = 0: MijissouR = 0
For i = 2 To Nagasa
If Val(Right(Left(roke, i), 1)) <> 0 Then Exit For
Next
Kategori = Left(roke, i - 1)
For i = 1 To Len(roke)
If Mid(roke, i, 1) = "," Then
exec = True
Exit For
Else
exec = False
End If
Next
If exec Then
Selection.Offset(0, -1).Select
Koumoku = ActiveCell.Value
Koumoku = Koumoku + 0.01
Selection.Offset(1, 0).Select
ActiveWindow.SmallScroll Down:=1
Selection.EntireRow.Insert
ActiveCell.Value = Koumoku
For i = 1 To Len(roke)
A = Left(roke, i)
B = Right(A, 1)
If B = "," Then
If Not IsNumeric(Mid(roke, i + 1, 1)) Then
Exit For
End If
ElseIf i = Len(roke) Then
Exit For
End If
Next
Selection.Offset(-1, 1).Select
If Left(roke, 1) = "<" Then MijissouL = 1
If Right(Left(roke, i - 1), 1) = ">" Then MijissouR = 1
strcnt = i - 1 - MijissouL
ActiveCell.Value = Right(Left(roke, strcnt), strcnt - MijissouR)
roke = Right(roke, Nagasa - i)
Selection.Offset(1, 0).Select
ActiveCell.Value = roke
Selection.Offset(-1, 0).Select
End If
Selection.Offset(1, -1).Select
Loop
End Sub
お〜、師匠に先越されてしまったで。
わたしゃ他人様のコードを読みとる理解力も根気もおまへんのんで、弥太郎流のコード
を作ってみましたわ。
A1から下へデータが並んどって、E,F列に結果をアウトプットする仕様になっとります
さかい、必要に応じてご自分の適用範囲へコードを書き換えてくだはい。
ほな...(弥太郎)
'---------------------------
Sub kubn()
Dim i As Integer, t As Integer, n As Integer, y As Integer
Dim maxrow As Long
Dim grup() As Variant
For i = 1 To Range("a65536").End(xlUp).Row
t = 0
ReDim Preserve grup(t)
f = Split(Cells(i, 2), ",", -1)
grup(t) = f(0)
For n = 1 To UBound(f)
ReDim Preserve grup(t)
If IsNumeric(f(n)) Then
grup(t) = grup(t) & "," & f(n)
Else
t = t + 1
ReDim Preserve grup(t)
grup(t) = f(n)
End If
Next n
maxrow = Range("e65536").End(xlUp).Row + 1
For y = 0 To UBound(grup)
If y = 0 Then
If maxrow = 2 Then
maxrow = maxrow - 1
End If
Cells(maxrow + y, 5) = "'" & i
Else
Cells(maxrow + y, 5) = "'" & i & "." & "0" & y
End If
Cells(maxrow + y, 6) = grup(y)
Next y
Next i
End Sub
1 FL9001-9002,9101 1.01 FB3502-3504,4101 1.02 4101-4102 1.03 4502-4503 1.04 4801-4802 1.05 4901-4906
とゆー結果になります。
1.02以降にも頭にFBとつけたいのですが・・・ご教授お願いしますm(_ _)m
後、ここに書き込みをする際プレビューを押すと、表示が書き込みと変わって
文字が大きくなったり、しますがどうすればよいのですか?
(わからず)
私のほうはexecの条件が適当すぎたみたいですね。
お。 kategoriってそのためにあったんですか。 それで mijissou の扱いは?
弥太郎さんのコードでは
Cells(maxrow + y, 6) = grup(y)
がデータの出力ですから、そこにご自分で考えられた
For i = 2 To Nagasa
If Val(Right(Left(roke, i), 1)) <> 0 Then Exit For
Next
Kategori = Left(roke, i - 1)
を組み込んでみては? (ramrun)
mijissouはその後のコードをみても使用していなかったので、削除したいと思います。
>がデータの出力ですから、そこにご自分で考えられた
申し訳ないです・・・他の人が組んだものを修正させられているので・・・
いまいち理解ができていないです。教えていただけないでしょうか?m(_ _)m
(わからず)
>他の人が組んだものを修正させられている
冷たいようですが、そんなことは私には関係ないことです。 あなた自身が自分でやる気があるのかどうかです。
とりあえず Cells(maxrow + y, 6) = grup(y)
のところを↓のようにしてみてください。 Kategoriのコードを組み込んだだけなので、 条件を見直さなければいけないかもしれません。 (ramrun)
For n = 2 To Len(grup(y))
If Val(Right(Left(grup(y), n), 1)) <> 0 Then Exit For
Next
If IsNumeric(Left(grup(y), 1)) Then
grup(y) = kategori & grup(y)
Else
kategori = Left(grup(y), n - 1)
End If
Cells(maxrow + y, 6) = grup(y)
ふがいない弟子の尻ぬぐいご苦労はんです。(笑) 最初に貰うた情報には4000-4001等数値同士がハイフンで繋がってるなんぞおまへん でしたもんで・・・、いちゃもんは(わからず)さんの方へどうぞ。
今申しました通り4000-4001にも英語をつけて拾うように書き換えときますた。
ほんなら...(弥太郎)
'-------------------------
Sub kubn()
Dim i As Integer, t As Integer, n As Integer, y As Integer
Dim maxrow As Long
Dim grup() As Variant
For i = 1 To Range("a65536").End(xlUp).Row
t = 0
ReDim Preserve grup(t)
f = Split(Cells(i, 2), ",", -1)
grup(t) = f(0)
For n = 1 To UBound(f)
ReDim Preserve grup(t)
If IsNumeric(f(n)) Then
grup(t) = grup(t) & "," & f(n)
Else
If Not IsError(Split(f(n), "-")) And IsNumeric(Left(f(n), 1)) Then
t = t + 1
ReDim Preserve grup(t)
grup(t) = get_strg(grup, t) & f(n)
Else
t = t + 1
ReDim Preserve grup(t)
grup(t) = f(n)
End If
End If
Next n
maxrow = Range("e65536").End(xlUp).Row + 1
For y = 0 To UBound(grup)
If y = 0 Then
If maxrow = 2 Then
maxrow = maxrow - 1
End If
Cells(maxrow + y, 5) = "'" & i
Else
Cells(maxrow + y, 5) = "'" & i & "." & "0" & y
End If
Cells(maxrow + y, 6) = grup(y)
Next y
Next i
End Sub
'-----------------------------------
Function get_strg(ByVal grup As Variant, ByVal t As Integer) As String
Dim i As Integer
For i = 1 To 2
If Not IsNumeric(Mid(grup(t - 1), i, 1)) Then
get_strg = get_strg & Mid(grup(t - 1), i, 1)
Else
Exit Function
End If
Next i
End Function
(わからず)さん、遅うなってごめんなはれや。 例によってケンショウブソクですわ、はい。(汗) If maxrow=2 Thenを If Cells(1,5)="" Then に変えておくんなはれ。 これでいけるとおもいまっせ。タブン・・・。 あかんかったらまたカキコしとってくだはい。アスの夜になります。 ほな...(弥太郎)
現在の出力結果は
A B
1 TP3205-3206
1.01 TP4502-4503
2 TP3205-3206
3 TP3205-3206
4 TP3205-3206
5 TP3205-3206
5.01 TP4502-4503
となります。
A B
1 TP3205-3206
1.01 TP4502-4503
2
3
4
5 TP3205-3206
5.01 TP4502-4503
と出力させれるようにしたいですm(_ _)m
(わからず)
ちょっと、わからず屋はん。 そう言う例示は最初からいうてくれまへんか? でないと、またコードをいじらなあきまへんさかいなぁ。 はっきり言うて二度手間、三度手間になりまんねんで、えぇ。 が、そこんとこが(わからず)のHNを名乗る所以なんでっしゃろけどなぁ。(笑)
余談はさておいて
下のコードに書き換えてくだはい。
ほな...次は何が出てくるんやろ(弥太郎)
'---------------------------------
Sub kubn()
Dim i As Integer, t As Integer, n As Integer, y As Integer
Dim maxrow As Long
Dim grup() As Variant
For i = 1 To Range("a65536").End(xlUp).Row
flag = False
t = 0
ReDim Preserve grup(t)
If Cells(i, 2) <> "" Then
f = Split(Cells(i, 2), ",", -1)
grup(t) = f(0)
For n = 1 To UBound(f)
ReDim Preserve grup(t)
If IsNumeric(f(n)) Then
grup(t) = grup(t) & "," & f(n)
Else
If Not IsError(Split(f(n), "-")) And IsNumeric(Left(f(n), 1)) Then
t = t + 1
ReDim Preserve grup(t)
grup(t) = get_strg(grup, t) & f(n)
Else
t = t + 1
ReDim Preserve grup(t)
grup(t) = f(n)
End If
End If
Next n
Else
flag = True
Cells(Range("e65536").End(xlUp).Row + 1, 5) = "'" & Cells(i, 1)
End If
If flag = False Then
maxrow = Range("e65536").End(xlUp).Row + 1
For y = 0 To UBound(grup)
If y = 0 Then
If Cells(1, 5) = "" Then
maxrow = maxrow - 1
End If
Cells(maxrow + y, 5) = "'" & i
Else
Cells(maxrow + y, 5) = "'" & i & "." & "0" & y
End If
Cells(maxrow + y, 6) = grup(y)
Next y
End If
Next i
End Sub
'-----------------------------------
Function get_strg(ByVal grup As Variant, ByVal t As Integer) As String
Dim i As Integer
For i = 1 To 2
If Not IsNumeric(Mid(grup(t - 1), i, 1)) Then
get_strg = get_strg & Mid(grup(t - 1), i, 1)
Else
Exit Function
End If
Next i
End Function
>嫌気をささずにご回答よろしくお願いします 別に嫌気が差しとるわけやおまへんでぇ、えぇ。 これは、はい、私のミスショットですさかいナ。喜んで修正させて貰いますワ。 お互いミスショットの連発で、まぁ、イーブンっちゅうとこでんな。(笑) 長うなるんで上のコードを差し替えときました。 試してみておくんなはれ。 ほな...(弥太郎)
A B
1 A1,3,5,10-13,B1,3,5,10-3
とデータがある場合、
A B
1 A1,A3,A5,A10,A11,A12,A13,B1,B3,B5,B10,B11,B12,B13
と出力させるようにしたいのですが・・・
ご回答よろしくお願いしますm(_ _)m
あのねえ(わからず)さん。 申し訳おまへんけど http://ryusendo.no-ip.com/cgi-bin/fswiki/wiki.cgi?page=%CC%EF%C2%C0%CF%BA%A4%CE%C9%F4%B2%B0 に弥太郎の部屋ッちゅうんがありますさかいナ、そこへあらゆるデータを書き込んで それをどうしたいんかを書いてくれしまへんか? 現状ではなんやら規則性がのうなってきとるみたいなんで、また新しい問題が発生 しかねまへんやろ? せやさかい、あそこやったらどんなに長うなってもかめしまへんから洗いざらいの データパターンを書き込んでくだみてはい。編集ででけますさかいナ。 念のために申し上げときますけどわたしゃ至って優しいにんげんですさかい、身構える 必要はおまへんでぇ。(笑) ほな...(弥太郎)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.