• ベストアンサー

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どちらでも結構ですので、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • argument
  • ベストアンサー率63% (21/33)
回答No.6

みなさんがどうしてそんなに難しく書くのかなぞですが。 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)
回答No.7

さらみで確認怠りました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 これで勘弁( 人 )

回答No.5

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

noname#204879
noname#204879
回答No.4

》 アンダースコアが何個あるかわかりません 最大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)
回答No.3

こんにちは。 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)
回答No.2

ユーザー定義関数で、こんなのではいかがでしょうか。 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)
回答No.1

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 こうゆう事でしょうか?

関連するQ&A

専門家に質問してみよう