- ベストアンサー
Excel(文字列操作)についての質問です。
今、Excelで、最初の文字とアンダースコアのあとの文字を取り出す方法を考えています。 (例:ABC_DEF_GHI→ADG) しかし、アンダースコアが何個あるかわかりません。 現在、A1セルに、ABC_DEF_GHIと入力されているとき、 =LEFT(A1,1) & MID(A1,FIND("_",A1,1)+1,1) & MID(A1,FIND("_",A1,FIND("_",A1,1)+1)+1,1)・・・・・ と入力すると取得は出来るのですが、アンダースコアの数が変更になると対応できません。 関数、VBAどちらでも結構ですので、よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
みなさんがどうしてそんなに難しく書くのかなぞですが。 data="ABC_DEF_GH・・・・"'アンダーバーで区切られたデータ spd=split(data,"_") for i = 0 to ubound(dpd) ans = ans =left(dpd(i),1) next ansが答えです。これだけでよいかと思います。 短いの説明するまでもないですが処理を説明します。 splitでデータを_区切りで配列化します。これでいくつあるのかも同時に分かります。なぜなら配列数はuboundで取得できるからです。 あとはその配列分forでまわすだけです。 回す際にleftで左から一文字だけを取りそれをansに配列の数だけ連結し続けます。 これで「最初の文字とアンダースコアのあとの文字を取り出す」の処理はおしまいです。どうでしょうか?ね、簡単でしょ? 処理違いや補足・修正が欲しい場合言ってください。書き直します。
その他の回答 (6)
- argument
- ベストアンサー率63% (21/33)
さらみで確認怠りましたorzめっさ被ってますねOTL。 という訳で他の方法です。正規表現で置換を行います。 下記を実行すれば頭順にabcdefが返るはずです。 Sub saasen() a = "ab_bdfa_cdas_ddse_esdd_fsda" '_区切りデータ Set re = CreateObject("VBScript.RegExp") re.Pattern = "_." '検索する正規表現パターン re.Global = True '検索範囲はグローバル re.IgnoreCase = True '大文字・小文字を区別する Set Matches = re.Execute(a) For Each Match In Matches ans = ans & Match.Value Next Match re.Pattern = "_" MsgBox re.Replace(Left(a, 1) & ans, "") End Sub これで勘弁( 人 )
- 米沢 栄蔵(@YON56)
- ベストアンサー率36% (37/102)
XXという名前のシートにおいて、セルA1にABC_DEF_GHIというデータが入力され、Enterキーが押されれば、自動的にお望みの結果を得るマクロを書きます。 この記述は、Microsoft Excel ObjectsのXXシートに書きます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim A,B,C,D Dim AA,BB,CC A=Target.Row B =Target.Column If A=1 and B=1 Then AA = Cells(A,B).Value C=Len(AA)-Len(Replace(AA,"_","")) BB=AA CC="" For B=1 To C CC=CC&Left(BB,1) BB=Right(BB,Len(BB)-Instr(BB,"_")) Next B End If End Sub
》 アンダースコアが何個あるかわかりません 最大5個と仮定して、そのようなデータが Sheet1 のA列にあるとします。 1.Sheet2 のセル A1 に次式を入力して、此れを下方にズズーッと ドラッグ&ペースト =LEFT(Sheet1!A1,1)&LEFT(Sheet1!B1,1)&LEFT(Sheet1!C1,1)&LEFT(Sheet1!D1,1)&LEFT(Sheet1!E1,1)&LEFT(Sheet1!F1,1) 2.Sheet1 のA列を選択 3.[データ]→[区切り位置]を実行 4.“カンマやタブなどの・・・区切られたデータ”に目玉を入れて [次へ]をクリック 5.“その他”の右側のボックス内にアンダースコア(_)を入力して [完了]をクリック したら、Sheet2 のA列はどうなりますか?
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 Split で区切り文字 "_" で配列にばらし、各要素の初めの一文字を 連結すれば良いと思いますよ。こんな感じの関数を書いて、 Public Function CS(ByVal Source As Variant) Dim v As Variant Dim s As String For Each v In Split(Source, "_") s = s & Left$(v, 1) Next CS = s End Function ワークシートで数式 =CS(A1) とか。 Split は Excel2000 以降限定になりますけど、そろそろ問題ないの ではないかと...
- mitarashi
- ベストアンサー率59% (574/965)
ユーザー定義関数で、こんなのではいかがでしょうか。 Function test(target As String) Dim buf As Variant Dim buf2 As String Dim i As Long buf = Split(target, "_") For i = 0 To UBound(buf) buf2 = buf2 & Left(buf(i), 1) Next i test = buf2 End Function
- n-jun
- ベストアンサー率33% (959/2873)
Sub サンプル() Dim c, v, st As String Dim match, matches v = Array("ABC_DEF_GHI", _ "ABC_DEF_GHI_ABC_DEF_GHI") With CreateObject("VBScript.RegExp") .Pattern = "\_\w{1}" .Global = True For Each c In v If .TEST(c) Then st = Left(c, 1) Set matches = .Execute(c) For Each match In matches st = st & Replace(match.Value, "_", "") Next MsgBox st st = "" End If Next End With End Sub こうゆう事でしょうか?