Excelでマクロを使って値の抽出をする方法

このQ&Aのポイント
  • Excelでマクロを使って値の抽出をしたい場合、B列の数字部分を抜き出して表示する方法について教えてください。
  • 具体的な手順として、B列の数字部分をC列、D列、E列にそれぞれ表示させる方法をお伺いしたいです。
  • どうかご回答をお願いします。
回答を見る
  • ベストアンサー

値の抽出

Excelでマクロを使って値の抽出をしたいのですが、自分ではうまくいきません。どうかお力をお貸し下さい。 A1セル:品番 A2セル:DDH0020 A3セル:DDH0030 A4セル:DDH0040 A5セル:DDH0050 … A30セル:DDH0150 B1セル:品名 B2セル:ゴウハン 13*20.0X 56X807 U B3セル:ゴウハン 13 20.0X 56X845 U B4セル:ゴウハン 13 20.0X 85X1257 U B5セル:ゴウハン 13 20.0X 56X1280 U … B30セル:ゴウハン 13*20.0X 232X1897 U このような形で30行目まであります。 この内のB列の数字部分(2行目であれば)、20と56と807を抜き出し C2セル:20,D2セル:56,E2セル:807 (3行目であれば) C3セル:20,D3セル:56,E3セル:845 (4行目であれば) C4セル:20,D4セル:85,E4セル:1257 と表示させたいのです。 ご面倒おかけしますが、どうかご回答をお願いします。

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

  • ベストアンサー
noname#144013
noname#144013
回答No.1

こんにちは。 マクロの一例を考えてみました。 的外れだった場合はすみません。 ■前提条件 1)取り出す対象の「数字文字列」は、全て、半角の「数字文字」("0"~"9")と、  半角の"."(ピリオド=小数点)からなる文字列のみとする。 2)数字が連続した部分文字列(小数点も含む)を、1つの「数字文字列」とする。   ご提示の例にある以下の文字列、     ゴウハン 13*20.0X 56X807 U   の場合、「数字文字列」は、     1番目 = 13     2番目 = 20.0     3番目 = 56     4番目 = 807   となります。 ■マクロの概要&使用方法 1)マクロは、引数と戻り値がある、以下のような「ユーザー関数」とし、   セルの数式として利用できるものとします。  <ユーザー関数の仕様>   【関数名】 : GetNumber   【機 能】  : セル上の文字列より指定番目の数値を取得   【引 数】     ByrRef rgCell As Range   : セルのRangeオブジェクト     ByVal nNumPos As Integer : 文字列内の数値の位置   【戻り値】     Variant : 指定位置の数値 2)セルの設定   B列 : 数値を取り出す対象の文字列   C列 : B列の文字列内の、2番目の数値         ・「数式」を設定(今回のユーザー関数を使用します)         ・表示形式 : 数値(小数点以下の桁数 = 1)   D列 : B列の文字列内の、3番目の数値         ・「数式」を設定(今回のユーザー関数を使用します)         ・表示形式 : 標準   E列 : B列の文字列内の、4番目の数値         ・「数式」を設定(今回のユーザー関数を使用します)         ・表示形式 : 標準   <数式の例>    C2 =GetNumber($B2,2)    D2 =GetNumber($B2,3)    E2 =GetNumber($B2,4)    ※C列~E列の3行目以降のセル範囲には、C2~E2のセル範囲をコピーし、     その「数式」をコピーします。 ■マクロ(ユーザー関数) ※下記のマクロは、「標準モジュール」に実装して下さい。 注)インデント等のため全角スペースを入れています。 ========================= Option Explicit ' '===================================================== ' GetNumber:セル上の文字列より指定番目の数値を取得 '【引数】 ' ByrRef rgCell As Range  :セルのRangeオブジェクト ' ByVal nNumPos As Integer :文字列内の数値の位置 '【戻り値】 ' Variant :指定位置の数値 '===================================================== Function GetNumber(ByRef rgCell As Range, _           ByVal nNumPos As Integer) As Variant   'セルが複数だった場合は戻る   If rgCell.Count <> 1 Then     GetNumber = ""     Exit Function   End If   Dim i As Integer    'ループ変数   Dim nStrLen As Integer 'セル上の文字列の文字数   Dim nNumCnt As Integer '数字文字列の位置(順番)   Dim s1 As String    '文字列ワーク(1)   Dim s2 As String    '文字列ワーク(2)   Dim s3 As String    '文字列ワーク(3)   s1 = rgCell.Text 'セル上の文字列取得   s2 = ""      '文字列ワーク(1文字取得用)をクリア   s3 = ""      '文字列ワーク(数字文字列用)をクリア   nStrLen = Len(s1) '文字列の文字数取得   nNumCnt = 0    '数字文字列の位置を初期化   '文字列から数字文字列を取り出す(文字数分ループ)   For i = 1 To nStrLen     s2 = Mid(s1, i, 1)   '1文字ずつ取り出し     If s2 Like "[0123456789.]" Then '数字or小数点?       If Len(s3) < 1 Then         nNumCnt = nNumCnt + 1  '数字文字列の位置を+1       End If       s3 = s3 & s2  '数字文字列に数字文字を追加     ElseIf Len(s3) > 0 Then     '数字文字列あり?       If nNumCnt = nNumPos Then         Exit For  '指定位置の数字文字列ならループを抜ける       End If       s3 = ""   '数字文字列をクリア     End If   Next i   '指定位置の数字文字列があれば戻り値として返す   If nNumCnt = nNumPos And IsNumeric(s3) = True Then     GetNumber = Val(s3)   Else     GetNumber = ""   End If End Function ========================= 添付画像は、上記マクロ実装後のExcelシート画面の例です。 以上です。参考になれば幸いです。

08517502
質問者

お礼

わぁ!出来ました。 ご丁寧な説明に画像まで付けて頂き、とても分かりやすかったです。 ありがとうございました。

関連するQ&A

  • データ抽出について教えて下さい。

    以前質問し、マクロを作って頂いたのですが、行と列を挿入しなくてはならなくなり、マクロが機能しなくなってしまいました。 ●以前の質問● セルA1:カベシタジゴウハン 9X 50X1800 D9 セルA2:ウケゴウハン T5.5 40X 300 U7 セルA3:ゴウハンK 2.5X 60X 80 スペーサー セルA4:ランバP *412X3547 W2 セルA5:VSF K 12.5X 47X 869 LE セルA6:VSF J*12X 68X2395 Wメン WX とシートに入っているとします。これを、 セルB1:9  セルC1:50  セルD1:1800 セルB2:5.5  セルC2:40  セルD2:300 セルB3:2.5  セルC3:60  セルD3:80 セルB4:空白 セルC4:412 セルD4:3547 セルB5:12.5 セルC5:47  セルD5:869 セルB6:12  セルC6:68  セルD6:2395 と入るように関数を使うにはどうしたら良いでしょうか。 マクロでも構いません。 ●採用させて頂いた回答● Sub test() Dim i, ii, iii Dim a As String For i = 1 To Range("a65536").End(xlUp).Row a = "" iii = 0 For ii = 1 To Len(Cells(i, 1).Value) If IsNumeric(Mid(Cells(i, 1).Value, ii, 1)) Or Mid(Cells(i, 1).Value, ii, 1) = "." Then a = a & Mid(Cells(i, 1).Value, ii, 1) ElseIf a <> "" Then Cells(i, 2).Offset(, iii).Value = a a = "" iii = iii + 1 End If If iii = 3 Then Exit For Next ii Next i End Sub ●今回セルが変わりました● セルB2:カベシタジゴウハン 9X 50X1800 D9 セルB3:ウケゴウハン T5.5 40X 300 U7 セルB4:ゴウハンK 2.5X 60X 80 スペーサー セルB5:VSF K 12.5X 47X 869 LE セルB6:VSF J*12X 68X2395 Wメン WX とシートに入っています。これを、 セルC2:9  セルD2:50  セルE2:1800 セルC3:5.5  セルD3:40  セルE3:300 セルC4:2.5  セルD4:60  セルE4:80 セルC5:12.5 セルD5:47  セルE5:869 セルC6:12  セルD6:68  セルE6:2395 このように入るようにしたいのです。 以前採用させて頂いたマクロを修正したいのですが、どうも自分では失敗してしまいます。 お力をお貸し頂ければ幸いです。

  • Excelで、データの抽出について質問します。

    Excelの同一セル内の数字のみの抽出について教えて 下さい。 セルA1:カベシタジゴウハン 9X 50X1800 D9 セルA2:ウケゴウハン T5.5 40X 300 U7 セルA3:ゴウハンK 2.5X 60X 80 スペーサー セルA4:ランバP *412X3547 W2 セルA5:VSF K 12.5X 47X 869 LE セルA6:VSF J*12X 68X2395 Wメン WX とシートに入っているとします。これを、 セルB1:9  セルC1:50  セルD1:1800 セルB2:5.5  セルC2:40  セルD2:300 セルB3:2.5  セルC3:60  セルD3:80 セルB4:空白 セルC4:412 セルD4:3547 セルB5:12.5 セルC5:47  セルD5:869 セルB6:12  セルC6:68  セルD6:2395 と入るように関数を使うにはどうしたら良いでしょうか。 マクロを使うことになっても構いませんので、教えて下さい。

  • EXCELで指定した行内にある値以外を抽出する

    こんにちは。 業務で困っていることがあるので、知恵をお貸し下さい。 EXCELで指定した行内にある値以外を抽出したいのです。 A1:対象品番 B1:対象外 C1:数量 D1:納入日 E1:品番  F1:数量 A2:HHH6030 B2: C2: D2:09/9/29 E2:HIH6260 F2:1 A3:HHH6060 B3: C3: D3:09/9/29 E3:IIHK110 F3:84 A4:HHH7000 B4: C4: D4:09/10/1 E4:HHH6030 F4:24 A5:HHH7130 B5: C5: D5:09/10/1 E5:IHH7000 F5:8 A6:HHH7140 B6: C6: D6:09/10/1 E6:HHH7130 F6:2 とあります。 ●E列の中から、A列にある値以外のものを抜き出し、B列に値を返す。 ●の作業をしたいので、VBAを使ってもかまいませんので、何か良い方法があれば教えてください。 よろしくお願いします。

  • 4元連立方程式について

    Excelで方程式を解いたのですがひとつだけ答えが合わないのです。どなたかこの式の違うところを教えてください。 5x-2y+4z+3m=75 x+3y-5z-m=-36 4x-3y+z+4m=51 3x+5y-3z-2m=-12 Excel上での計算式↓ =(A1*E2*C3*D4-A1*E2*C4*D3-A1*E3*C2*D4+A1*E3*C4*D2+A1*E4*C2*D3-A1*E4*C3*D2-A2*E1*C3*D4+A2*E1*C4*D3+A2*E3*C1*D4-A2*E3*C4*D1-A2*E4*C1*D3+A2*E4*C3*D1+A3*E1*C2*D4-A3*E1*C4*D2-A3*E2*C1*D4+A3*E2*C4*D1+A3*E4*C1*D2-A3*E4*C2*D1-A4*E1*C2*D3+A4*E1*C3*2+A4*E2*C1*D3-A4*E2*C3*D1-A4*E3*C1*D2+A4*E3*C2*D1)/(A1*B2*C3*D4-A1*B2*C4*D3-A1*B3*C2*D4+A1*B3*C4*D2+A1*B4*C2*D3-A1*B4*C3*D2-A2*B1*C3*D4+A2*B1*C4*D3+A2*B3*C1*D4-A2*B3*C4*D1-A2*B4*C1*D3+A2*B4*C3*D1+A3*B1*C2*D4-A3*B1*C4*D2-A3*B2*C1*D4+A3*B2*C4*D1+A3*B4*C1*D2-A3*B4*C2*D1-A4*B1*C2*D3+A4*B1*C3*D2+A4*B2*C1*D3-A4*B2*C3*D1-A4*B3*C1*D2+A4*B3*C2*D1)

  • エクセル、任意の「行」だけを抽出したい。

    こんなことできますか? A1:F100のセル内にランダムに数字が入っています。 質問1) この中から 1行目→3行目→5行目と一つ飛ばしで入っているデータを抽出してH1:M100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 A1-B1-C1-D1-E1-F1 A2-B2-C2-D2-E2-F2 A3-B3-C3-D3-E3-F3 A4-B4-C4-D4-E4-F4 A5-B5-C5-D5-E5-F5 A6-B6-C6-D6-E6-F6 A7-B7-C7-D7-E7-F7 ・・・ A100-B100-C100-D100-E100-F100 の中から A1-B1-C1-D1-E1-F1 A3-B3-C3-D3-E3-F3 A5-B5-C5-D5-E5-F5 ・・・ を抽出して H1-I1-J1-K1-L1-M1 ・・・ H100-I100-J100-K100-L100-M100 の範囲内に表示させたいです。 質問2) 同様に、 1行目→4行目→7行目と二つ飛ばしで入っているデータを抽出してO1:T100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 ※ 説明がわかりにくいかもしれませんが、よろしくお願いします。

  • ワードの表の高さ変更

    たとえばワードで5×5の表を作成したあと、セルを結合したり分割したりして表を完成させている最中なのですが、高さ変更がうまくいかないセルにぶち当たりました。 指定するセルの高さ(表作成後のA1~A2間)だけ変更したいのですが、ドラッグしても隣の区切り(A2-E4)まで一緒にドラッグされて高さが変わってしまいます。 隣の高さを変えずに希望するセルだけ変更する方法を教えてください。 表デフォルト A1 B1 C1 D1 E1 A2 B2 C2 D2 E2 A3 B3 C3 D3 E3   A4 B4 C4 D4 E4  A5 B5 C5 D5 E5 ↓ 表作成後 A1 B1 C1 D1 E1    B2 C2 D2 E2    B3 C3 D3 E3   A2 B4 C4 D4 E4     B5 C5 D5 E5 ↓ A1~A2を引っ張るとこうなってしまう A1 B1 C1 D1 E1    B2 C2 D2 E2    B3 C3 D3 E3   A2 B4 C4 D4 E4     B5 C5 D5 E5 どうにかして他の列には影響を与えずAのセルだけ高さを自由に変えたい ↓ A1 B1 C1 D1 E1    B2 C2 D2 E2 A2 B3 C3 D3 E3      B4 C4 D4 E4     B5 C5 D5 E5 追記:A1,A2間の区切りをドラッグすると表全体を下に伸ばすことは可能ですが上に伸ばそうとするとB4に入力されている文字にぶつかってこれ以上縮めることはできません 説明がヘタクソで申し訳ないんですがよろしくお願いします

  • エクセルで斜めに参照コピー

    1| A1 | B1 | C1 | D1 | E1・・・ 2| A2 | B2 | C2 | D2 | E2・・・ 3| A3 | B3 | C3 | D3 | E3・・・ 4| A4 | B4 | C4 | D4 | E4・・・ ・・・ と普通に並んでいるデータを 1| A1 | B2 | C3 | D4 | E5 |・・・ 2| = | A2 | B3 | C4 | D5 | E6 |・・・ 3| = | = | A3 | B4 | C5 | D6 | E7 |・・・ ・・・ (=は空白セル) とななめに参照コピーさせたいのですが、普通にドラッグコピーさせたのではうまくいきません。データ数が結構多いもので一つ一つコピーするのも大変です。何か簡便な方法はあるでしょうか?列毎もしくは行毎の作業でもいいので、何か良い方法がありましたらご教示いただけませんでしょうか?

  • エクセルの値の選択について

    以前までできたのですが、数日前からできなくなってしまい不便です。原因も分からなく困ってます。設定等やり方を教えてください。 エクセルで、下記の例のとおり、A1のセルからE5のセルまで全てに値が入っております。A1からA5を全て選択したい時に今までは、A1にカーソルを置いた状態で「shift+ctrl+↓」を押すと一気にA1からA5までが選択できました。(ドラッグした状態) 数日前からその操作ができなくなってしまいました。  併せて、A5にカーソルを置き、E5にカーソルを飛ばしたい時は「ctrl+→」でカーソル移動ができました。この操作も今はできなくなってしまいました。 設定をどのようにすれば良いのか教えてください。よろしくお願いします。 <例> A1 B1 C1 D1 E1 A2 B2 C2 D2 E2 A3 B3 C3 D3 E3 A4 B4 C4 D4 E4 A5 B5 C5 D5 E5  

  • エクセルで行を越えての貼り付け

    X1~X100に数値が入っていて これを5列で1行おきとか2行おきとかに 並べ替えたいのですがアドバイスお願いいたします データーが100くらいなら良いのですが もっと多いので簡単な方法をアドバイスください X1~X100に数値 A1~E1に X1~X5 A1=X1 B1=X2 C1=X3 D1=X4 E1=X5 A5~G5に X6~X10 A5=X6 B5=X7 C5=X8 D5=X9 E5=X10 と言う風にしたい A1:E1をコピーして間に3行挟んでA5:E5に貼り付け するとデーターが A5~G5に X5~X9とずれてしまいます 4行挟んでコピーすれば正しく貼り付けますが 1行挟んでも2行挟んでも3行挟んでも 何行挟んでも良いようにするには どうすれば良いでしょうか よろしくお願いいたします。

  • 数式が入った空白のセルを合計するとき

    数式が入った空白のセルを合計するとき WINDOWS XP EXCELL 2003 です。 各セルの数式は C43 =SUM(B36-C36) D36 =SUMPRODUCT((入力!$C$2:$C$50=$A36)*(入力!$A$2:$A$50=D$1),入力!$E$2:$E$50) E36 =SUMPRODUCT((入力!$D$2:$D$50=$A36)*(入力!$A$2:$A$50=D$1),入力!$F$2:$F$50) E43 =SUM(C43+D36-E36) と数式がそれぞれに入っています。 ご教示を仰ぎたいのは D36,E36 に値がない空白のセルですがこの場合、E43 G43 I43 と表示(この場合 50,000)がされますがD36 若しくはE36に値が表示されたときのみにE43 を表示したいのですが可能でしょうか。 目的は見やすくしたいのですが。 ご指導いたたければ幸甚の至りです。