• ベストアンサー

マクロである文字以降の文字列を取得するには?

2枚のシートの一部ずつを条件に合わせ取り入れ新シートを作るマクロを作っています。 そこで1つ問題な列があります。 D列の各セルには「,」で区切られて2つのデータが入っています。 123 , 456 55 , 67 8 , 1 678 , 9      の様な形です。 「,」の両側にはスペースが入っています。 このうちの「,」の右側の数値を変数に入れたいんですが、文字数が行によって違います。 右側がスペースを含めて3文字に決まっているなら、   変数 = Right(Cells(i, 4), 3) の様な感じになりますが、一桁から三桁まであります。 こういう場合、「,」の右側を取得する関数とか有るんでしょうか? それとも他の方法を取るんでしょうか?

noname#30411
noname#30411

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

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

こんばんは。 >「,」の右側を取得する関数とか有るんでしょうか? Excel 2000以上では、Split 関数もありますが、他には、InStr 関数を使うことが出来ます。ワークシート関数のFind関数等に相当します。VBAのMid関数は、最後まで取る時は、Mid(文字列,スタート,文字数)の文字数を省略できます。これは、数値のみになります。 Sub Sample2() Dim c As Range Dim Rnum As Long For Each c In Range("D1", Range("D65536").End(xlUp)).Cells   If Not IsEmpty(c) Then    On Error Resume Next   '右側の数値    Rnum = CLng(Mid$(c.Value, InStr(c.Value, ",") + 1))    On Error GoTo 0   '処理例・右側の数字    c.Offset(, 1).Value = Rnum    Rnum = 0 'エラーが発生した時に、クリアするため   End If Next End Sub ちなみに、左側の場合は、以下のようなコードになります。 Lnum = CLng(Mid$(c.Value, 1, InStr(c.Value, ",") - 1))

noname#30411
質問者

お礼

InStrで文字を指定し、Midと組み合わせても良いんですね。 教えて頂いたので、旨くいきました。 丁寧なマクロ有り難うございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

下記のどれか (1)マクロを使わずともデータ-区切り位置-・・・の操作でできる。 (2)VBAでは(1)にあたるのはSplit関数です (3)Instr関数でカンマの位置を知り、Mid関数で分離し、TRIM関数で余分なスペースを取り除く

noname#30411
質問者

お礼

以前、imogasiさんにお答えを頂いた事があるんですが、すでにお礼の欄を書いて締め切る時だったので、失礼しました。 これからもよろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

VBAの関数「Split」を利用します。 文字列を指定文字(デフォルトはカンマ)で配列に変換するので ご希望の「カンマの右」は(1)の要素です。(0)はカンマの左。 標準モジュールの追加を行い、下記を貼り付けてください。 シート上でセルD2を分離し、E2に表示するには セルE2に式「=分離(D2)」を設定してください。 ただし、戻り値を文字型にしてあるので、適宜数値へ変換の判断を加えてください。 変数名は説明を兼ねて漢字にしていますがそのままで動作します。 Function 分離(文字列 As String) As String Dim 文字配列() As String Dim 配列件数 As Long 文字配列() = Split(文字列, ",") nArrey = UBound(文字配列()) If nArrey > 0 Then 分離 = Trim(文字配列(1)) Else 分離 = "" End If End Function  

noname#30411
質問者

お礼

Splitを使えば良いんですね。、有り難うございます。 これは、そのままで使うと変数に文字列を入れると言うより、もう一つの列に分離したのを入れるユーザー関数ですよね? エラーが出たんですが、nArreyが引っ掛かってると思うんで(Option Explicit)、さらに試してみます。UBoundなど難しい関数が出てるんでもうチョッと勉強してみます。

関連するQ&A

  • エクセルの文字列置換マクロに関するご相談

    下方のマクロを実行することにより、 文字列リストの内容に基づいて、 別シート(作業)内の文字列を変換することができます。 文字列からコード値へ変換することを目的にマクロを埋め込んだのですが、 別シート(作業)の文字列をコード値に変換した際、3桁くぎりのコード値が並んだ場合に、 自動で数値として認識されてしまいます。 ※別シート(作業)のセルを文字列し設定しても発生します。 プログラムで回避手段があるようでしたらご教示いただければ幸いです。 例)文字列リストシート A B さる 10 ぞう 15 ごりら 101 きりん 102 わに 103 かば 104 マクロ実行前の作業シート A さる,ぞう ごりら ごりら,きりん,わに さる,ごりら マクロ実行後の作業シート A 10,15 101 101102103 10101 上記マクロ実行後のシートの3~4行目のように、 カンマが取れることを防ぎ、文字列として代入したい所存です。 <マクロ> Sub 文字列リストに基づき連続して置換する() i = 2 Do x1 = Sheets("文字列リスト").Cells(i, 1) x2 = Sheets("文字列リスト").Cells(i, 2) Sheets("作業").Cells.Replace _ What:=x1, Replacement:=x2, _ SearchOrder:=xlByColumns, MatchCase:=True i = i + 1 Loop Until Sheets("文字列リスト").Cells(i, 1) = "" End Sub ご教示いただければ幸いです。 よろしくお願いいたします。

  • 文字列を間引く方法

    EXCEL関数、あるいはマクロで下記の処理ができないでしょうか。    1列 1行 T20339636 2行 T20379678 3行 T20340013 のように各セルに9桁の文字列が設定されています。 各文字列の2桁目から5桁目までを間引き、下記のように 設定する。    1列 1行 T9636 2行 T9678 3行 T0013 ご教授のほど、よろしくお願いいたします。

  • セルの書式が標準なのに文字列にできるのはなぜ?

    会社のシステムで吐き出したデータですが セルの書式設定が標準なのに文字列となっています。 マクロを利用して、あるセルの値を別セルへ転記すると、 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示になってしまいます。 会社のシステムが吐き出したエクセルはセルの書式が標準なのに 中の数字が文字列でいられるのが疑問です。 会社のシステムの吐き出したデータは Microsoft Excel 2.1ワークシートで 全てのセルの書式設定は「標準」です。 で例えば 12345678901234 は 12345678901234 と表示されていて 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) 0101という値のセルでも 表示は0101ですが 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) それらのセルの値をマクロとかで別セルに転記すると 転記先では1.23457E+13 と表示されてしまいます。 (0101は101になります。) まっさらなエクセルに自分で手入力すると ・セルの書式設定が標準だと 12345678901234 ↓ 1.23457E+13になります。 ・セルの書式設定が数値だと 12345678901234 ↓ 12345678901234 ・セルの書式設定が文字列だと 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) なのに会社のシステムの吐き出しデータは セルの書式設定が標準なのにもかかわらず 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) となっています。 手入力で書式設定が標準の状態でセルに12345678901234 と表示させるには先頭に ' をつける方法しか知りませんが ' が無いのに表示されています。 でもこの該当セルをマクロで別セル(書式設定:標準)に転記すると 1.23457E+13 となります。 またシステムが吐き出したエクセルの同じシート内に 以下のマクロで転記すると ↓ Sub 転記() 行 = 2 Do If Cells(行, 6).Value = "" Then Exit Do If Cells(行, 6).Value >= 10 Then Cells(行, 7).Value = Range("A2") Else Cells(行, 7).Value = Range("A3") End If 行 = 行 + 1 Loop End Sub ↓ このマクロだと A列~F列が書式設定が標準なのに文字列として表示されているのですが 転記先のG列が書式設定が標準であっても 12345678901234 (数値が文字列と保存されています と注釈有) と同じ状態のまま転記できます。 新しいBOOKのシート2に 会社の吐き出しデータをシートコピーした後、 (セルの書式設定:標準だが文字列で表示されている) そのBOOKに登録されているマクロで シート2のセルからシート1のセル(書式設定:標準)に転記すると 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示 となってしまいます。 ちょっと混乱しています。 理屈等教えていただければと思います。お願いします。

  • 文字列変数で行端のスペースの個数を知りたい

    Excelのマクロで文字列の入った変数があります。 文字列の最後は必ず1個以上のスペースが付いていますが、最大7個続いている時もあります。 このスペースが何個か?を出したいです。 こういう場合、Right関数やReplace関数と繰返し構文を合わせて個数を数えていくのでしょうか。 それとも一発で数が出せる関数などが有るでしょうか。

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • <文字列マクロについて>

    <文字列マクロについて> 皆さま お力を貸して下さい。 初心者で、何もわからず書いておりますがすみません。 下記の2つのマクロを教えて下さい。 ?横に並んだ「ある行」に在るデータを「列」に変換し、  指定した数だけ並べる    あいうえお    ←A1セルからE1まで5列(これは状況により変わる)       ↓(マクロ実行:3行同じ数だけ並べるという指定)  あ        →A1セルから下にひたすら、同じ文字が続き順に並ぶ  あ  あ  い  い  い  う  う        →A1セルから下に並べる(3行は指定できれば別の数字にも変えたい  う  え  え  え  お  お  お ?規則的に並んだデータのまとまりをセットで移動する。  例だと5つの塊(これは変数とおきたい)    あ A              a  い B              b  う C               c   え D               d  お E              e    ↓(マクロ実行)  あ  い  う  え  お  A  B  C  D  E      ・  ・  ・  ・    a b c d e    

  • マクロ(VBA)での文字列操作

    こういうことできますか? Dim str as String str = Cells(1, 10) Length = Find("会計", str) つまり、エクセル上のセル内の文字列を取ってきて、 会計という文字列を含む場所が何文字目か知りたい。 ところが、Find関数か認識されずエラーが出ます。 Searchにしても同じです。 エクセル関数としては使えるのですが、マクロでは使えないのですか?

  • 分割マクロ

    よろしくお願いします。写真のように、一つの文字列に空白スペースが何ヵ所かあり、それを3分割に分けたいのですが、M列からO列が欲しい結果なのです。しかし、5行目のようにスペースがないものは、N列にしたいのです‼find関数Len関数left.right関数を駆使して、やっても良いのでしょうが、5行目、6行目のようにスペースが、たくさんあるものは、時間がかかりそうです。結局のところ、最初と最後の文字列にを抜き出し、残りは、N列にしたいのです。なにか、良いマクロ教えて下さい。よろしくお願いします。尚、スペースは全角スペースです。

  • Excelマクロにて文字列連結

    現在Excelのマクロにて文字列の連結を行っているのですが、 繋いだ文字列を改行を付けて連結を行いたいです。 セルとセルの中の文字列を改行を付けて連結するにはどうしたらいいのでしょうか? 例 A1セル「あああ」 B1セル「いいい」 C1セル「あああ       いいい」 Worksheets(sheet1).Range("C1").Value = Worksheets(sheet1).Range("A1").Value + Worksheets(sheet1).Range("B1").Value をすると 「あああいいい」と1行で表示されてしまいます。     ↑ ここに改行を入れるにはどうしたらいいのでしょうか? 以上、宜しくお願いします。

  • Excelの文字列操作について

    Right・Left・Mid関数は何桁目以降表示しなさい、とか何桁目以降何桁分を抽出しなさいという関数ですが、例えば、@AAAA@BBBBB@CC.***のような文字列があり、文字列の右側から何桁目に@が来るか知る関数はありますか?サンプルの文字列でいうと、***.CC@の順になりますので、7桁目と判るようにできますか?どなたかお知恵をお貸し下さい。よろしくお願い致します。

専門家に質問してみよう