• ベストアンサー

ExcelのVBAによるプログラム

恐れ入りますが、以下の条件分岐に関するプログラムについてご教授ください。よろしくお願い致します。 No  データ1  データ2 1  0.5   0.2 2  0.01  1.2 3  0.008 1.0 4  0.03  0.3 5  0.02  0.4 上記の様な集録データで、「データ1」が0.01以下のときの「集録ナンバーおよびデータ2」を抽出したいと思っています。 例えば、上記の例から考えますと、「No2と1.2」と「No3と1.0」ということになります。 しかし、このように連続したナンバーの場合だけは、最初の「No2と1.2」だけを抽出したいのです。こうしたプログラムについて、アドバイスをお願いいたします。   

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

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

こんばんは。 >データのないものを1つ、最後に抽出するようになっています。 データのないNoは、Ar3の変数に、すべて確保されていますが、そのうち1つだけ出すようにされています。 それと、結合されたセルを使う場合は、バージョンにもよりすが、Excelのバグが存在していますので、マクロでは問題ないとは思いますが、コピー&ペーストで、右側領域のセルでエラーを誘発することがありますから、十分に注意してください。出来る限り、広い領域で結合セルは使わないほうが良いようです。 '------------------------------------------- Sub PicupNo3()   Dim i As Long   Dim j As Long   Dim k As Long   Dim ar As Variant   Dim ar2() As Variant   Dim ar3() As Variant   With ActiveSheet     ar = .Range(.Cells(20, 4), .Cells(Rows.Count, 4).End(xlUp)).Resize(, 12)     For i = LBound(ar, 1) To UBound(ar, 1)        If IsEmpty(ar(i, 5)) Or Trim(ar(i, 5)) = "" Then         ReDim Preserve ar3(k)         ar3(k) = ar(i, 1)         k = k + 1       End If       If ar(i, 5) <= 0.01 Then         ReDim Preserve ar2(2, j)         If j > 0 Then           If ar(i, 1) > (ar2(0, j - 1) + 1) Then             ar2(0, j) = ar(i, 1)             ar2(1, j) = ar(i, 5)             ar2(2, j) = ar(i, 9)             j = j + 1           End If         Else           ar2(0, j) = ar(i, 1)           ar2(1, j) = ar(i, 5)           ar2(2, j) = ar(i, 9)           j = j + 1         End If       End If     Next i     For i = LBound(ar2, 2) To UBound(ar2, 2)      With .Cells(20 + i, 19)       .Offset(0, 0).MergeArea.Value = ar2(0, i)       .Offset(0, 4).MergeArea.Value = ar2(1, i)       .Offset(0, 8).MergeArea.Value = ar2(2, i)      End With     Next i     'データのないNo     .Cells(20 + i, 19).Value = "データのないNo"     .Cells(20 + i + 1, 19).Value = ar3(0)   End With End Sub

YT06
質問者

お礼

勉強になります。 ご親切にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • van111
  • ベストアンサー率14% (1/7)
回答No.8

no5です。 >>ナンバーのみすべてのセルにふっていたものですから、データのないものを1つ、最後に抽出するようになっています。 少し理解に欠けますが、要するにdata1が空白ならばわかりやすいように 記述をするということの認識でよろしいでしょうか? 一度下記記述で確認お願いいたします。 Sub test() i = 2: h = 1 Do While Cells(i, 1) <> "" If Cells(i, 2) = "" Then Cells(i, 5).Value = "DATAがありません" Else If Cells(i, 2) <= 0.01 Then If Cells(i - 1, 2) > 0.01 Then Cells(h, 5).Value = "no" & Cells(i, 1).Value & " " & Cells(i, 3).Value h = h + 1 End If End If End If i = i + 1 Loop End Sub

YT06
質問者

お礼

大変勉強になりました。 お力添え,ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

こんなの処理ロジッが大切で、それだけなら、VBAを知らなくてもできる。 そのロジックがわからないのだろう。だから質問者は丸投げにならざるを得ない。 ロジックは色々な方法が考えられ、コード行数や誤処理に影響を及ぼす。 一例で 処理は上行から下へ1行ずつ処理する(For Next) 「条件に合うもの(行)」の直近の行番号(A)を覚える変数を持っておく。 条件の判定をして、該当なら、今のセルの行番号がA+1なら書き出さない。そしてA=A+1とする。 A=A+1でなければ、書き出す。そしてA=0にでもしておく。 条件が合わない行なら、A=0にして、何もしないで次の行に行く。 ーー 結局場合分けの切り分けを見抜くことだ。 これはプログラムを多数経験して会得しないとならない。 == >抽出したデータを上詰めで整理していくための方法 書き出すシートの行番号を保持する変数Kを作って、書き出しの都度 K=K+1しておくと良い。 ーー 次々要求が出ているようだが、丸投げで、回答をコピペせざるを得ないだけのレベルらしいが、経験をつんでロジックを組み立てて、それを決めて、それを実現する数行のコード群が作れることが必要。 コードはあえて書かない。 ーー 無理しないで、関数で作業列を使い、条件充足のサインを立て、フィルタを使ってでも抜き出して、処理したら。

YT06
質問者

お礼

コードに関する学習が不十分で,みなさんにご迷惑おかけしております。厳しいご指摘,肝に銘じておきます。 個人で活用するものであるならば「関数で作業列を使い、条件充足のサインを立て、フィルタを使ってでも抜き出して、処理」という方法で十分だったのですが,子どもから大人まで共有できるものが必要となり,不慣れにも自動化を試みようとした次第です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • van111
  • ベストアンサー率14% (1/7)
回答No.5

no2です。 上詰めでいいんですね? ならこんな感じでしょうか? 違ってたらすいません。 Sub test() i = 2: h = 1 Do While Cells(i, 1) <> "" If Cells(i, 2) <= 0.01 Then If Cells(i - 1, 2) > 0.01 Then Cells(h, 5).Value = "no" & Cells(i, 1).Value & " " & Cells(i, 3).Value h = h + 1 End If End If i = i + 1 Loop End Sub

YT06
質問者

お礼

ご回答、ありがとうございました。 van111さん、そしてWendy02さんに心より感謝申し上げます。 このプログラム、早速仕様に合わせて改良させていただき、活用致しましたところ、ナンバーのみすべてのセルにふっていたものですから、データのないものを1つ、最後に抽出するようになっています。打開策がありましたら、またの機会によろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #3は、正規化ではなかったのではないのですね。#1の補足を読み違えました。 >No3のデータ2「1.0」が残ってしまうといった状況です。 は、残すようにしてありました。 >つまり,0.01以下のデータはすべてほしいのですが,ナンバーが連続した場合のみ,最初のナンバーだけ…という訳です。 最初という意味が、分かりませんでした。言葉では難しいです。 Sub PicupNo2()   Dim i As Long   Dim j As Long   Dim ar As Variant   Dim ar2() As Variant   With ActiveSheet     ar = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 3)     For i = LBound(ar, 1) To UBound(ar, 1)       If ar(i, 2) <= 0.01 Then         ReDim Preserve ar2(1, j)          '正規化ではなかった         If j > 0 Then           If ar(i, 1) > (ar2(0, j - 1) + 1) Then             ar2(0, j) = ar(i, 1)             ar2(1, j) = ar(i, 3)             j = j + 1           End If         Else           ar2(0, j) = ar(i, 1)           ar2(1, j) = ar(i, 3)           j = j + 1         End If       End If     Next i     .Cells(1, 5).Resize(, 2).Value = Array(.Cells(1, 1).Value, .Cells(1, 3).Value)     .Cells(2, 5).Resize(UBound(ar2, 2) + 1, UBound(ar2, 1) + 1) = _     Application.Transpose(ar2)   End With End Sub

YT06
質問者

お礼

何度もご回答、ありがとうございました。Wendy02さんにご紹介いただいたプログラム、私には初めて目にするものがたくさんありまして、理解に窮しております。 具体的なお話で恐縮ですが、実のところ、以下のように結合された枠に集録されたデータを、    D~G   H~K     L~O 20  1    0.5    0.2 21  2    0.01   1.2 22  3    0.008  1.0 23  4    0.03   0.3 24  5    0.01   0.4 ・ ・(5000くらいまで続いています) こちらの枠へ抽出したいのです。    S~V    W~Z    AA~AD 20  2    0.01   1.2 21  5    0.01   0.4 22 条件分岐についてはH~Kのセルが0.01以下であります。 重ね重ね申し訳ありませんが、もう一度お知恵を拝借できればと思っております。 お忙しいところすみませんm(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 たぶん、数式のほうが楽かもしれませんね。 ご質問にブレがあるようですが、オートフィルタなどを使ったほうが楽なような気がします。 '------------------------------------------- Sub PicupNo1()   Dim i As Long   Dim j As Long   Dim ar As Variant   Dim ar2() As Variant   With ActiveSheet     ar = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 3)     For i = LBound(ar, 1) To UBound(ar, 1)       If ar(i, 2) <= 0.01 Then         ReDim Preserve ar2(1, j)         '正規化         If j > 0 Then           If ar(i, 1) > (ar2(0, j - 1) + 1) Then             ar2(0, j) = ar(i, 1)           End If         Else           ar2(0, j) = ar(i, 1)         End If         ar2(1, j) = ar(i, 3)         j = j + 1       End If     Next i     .Cells(1, 5).Resize(, 2).Value = .Cells(1, 2).Resize(, 2).Value     .Cells(2, 5).Resize(UBound(ar2, 2) + 1, UBound(ar2, 1) + 1) = _     Application.Transpose(ar2)   End With End Sub '-------------------------------------------

YT06
質問者

お礼

ご回答、ありがとうございました。 早速、活用させていただきましたところ、ほぼイメージどおりなのですが、No3のデータ2「1.0」が残ってしまうといった状況です。連続した場合は、最初のデータのみの抽出を考えておりまして、その点改良しようとしております。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • van111
  • ベストアンサー率14% (1/7)
回答No.2

こんな感じかな? Sub test() i = 2 Do While Cells(i, 1) <> "" If Cells(i, 2) <= 0.01 Then If Cells(i - 1, 2) > 0.01 Then Cells(i, 5).Value = "no" & Cells(i, 1).Value & " " & Cells(i, 3).Value End If End If i = i + 1 Loop End Sub

YT06
質問者

お礼

ご回答、ありがとうございました。 イメージに大変近いものができまして、ここからならば自分で何とかできそうです。 もしよろしければ、抽出したデータを上詰めで整理していくための方法も、合わせてご伝授いただければと思います。van111さんにご紹介いただいた方法ですと、データに並んだ形で整理されていくものですから。 ご親切にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  >このように連続したナンバーの場合だけは、最初の「No2と1.2」だけを抽出したいのです  連続していないナンバーの場合は、どうするのですか?  例えば、6番目のデータとして、「6 0.001 0.5」等というデータがあった場合は。。。  あるいは、0.01以下のデータがとびとびに3件あった場合とか。。  プログラムを作成する場合、すべての条件が列記されていないと、思った通りの動作はしてくれませんよ。 補足願います。

YT06
質問者

補足

ご回答,ありがとうございました。ご説明が不十分でした。補足致します。 連続していないナンバーの場合は,すべて列挙させたいと考えています。例えば,akina_lineさんに挙げていただいた『6番目のデータとして、「6 0.001 0.5」等というデータがあった場合』であれば,以下のような抽出データがほしいと思っています。 No  データ1  データ2 2  0.01  1.2 6  0.001 0.5 つまり,0.01以下のデータはすべてほしいのですが,ナンバーが連続した場合のみ,最初のナンバーだけ…という訳です。 お知恵がありましたら,よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAでこういう事は可能でしょうか?

    エクセルで同一セル内に存在する特定の文字を検出する方法を教えて下さい。 (例) A1のセルに 変更(2004/10/21) 変更(2004/1/15) 変更(2004/5/10) B1のセルに 変更(2004/10/3) 変更(2004/10/1) 削除(2004/7/23) 上記のようなデータがあるとします。検索条件として、変更の文字が付いてて、日付が(2004/10)のみデータだけ検出したいのです。上記の例で言うと、3件。 VBAを使って上記の条件でデータを抽出する事は可能でしょうか?

  • ExcelでCDを入力して紐付いているNo.を抽出

    とある、チェックシートを作成しています。 Sheet1 過去に起きた事象にNo.を割り当て、それぞれの事象に共通する巡回時のポイント(着眼点)をCDで紐付けます。 カウント列は同じCDをカウントしています。 Sheet2 チェックシートに過去の事象をピックアップで紹介(抽出)します。 CDの列にに連続したCDを入力します。  例) 1.1.1.2.2.2.3.3.3.4.4.4.5.5.5.1.1.1. ... Sheet1からCDに紐ついたNo.を順番に抽出したいです。 ・CDに紐付いているNo.が1つなら1つを連続で抽出 ・CDに紐付いているNo.が2つなら2つを連続で抽出、3つ目は再び最初のNo.を抽出 ・CDに紐付いているNo.が3つなら3つを連続で抽出 ・CDに紐付いているNo.が3つ位上なら3つを連続で抽出、CD列に再び同じCDを入力したら4つ目のNo.を抽出 このように抽出したい場合、関数はどのようにすれば良いでしょうか? No.をSheet1を参照して手打ちで入力する方法もありますが、関数で一括して抽出できる方法がないかと質問させて頂きました。 詳しい方いましたら、ご教授下さい。 宜しくお願い致します。

  • エクセルVBAでのSQLについて

    エクセルVBAで、SQLを記述しているのですがwhereの抽出条件にセルの値を指定したいと思っています。その当該セルの値を変更することで、抽出条件を変更することができるようにしたいです。 しかし、どのような記述にすればよいか分かりません。以下のような記述をしたのですが、うまくいきません。すみませんが、教えていただけないでしょうか。よろしくお願い申し上げます。 ◆抽出条件を指定するセル:A1 セルA1には、数字(例:1000、2000等)をいれます。 mySQL = " SELECT * FROM [◆◆シート!] WHERE Range("A1")"

  • Access 都道府県名を抽出したい

    1つの項目に"/"で区切られ複数の情報が入っています。 例) 登録01/NO#0000/xx県/タイトル:xxx 上記のデータから、クエリの抽出条件に記載する、都道府県名だけを取り出す関数を教えてください。 instrやmidを組み合わせるのは分かるのですが、初心者のためうまくできません。 ご教授いただけると幸いです。よろしくお願い致します。

  • エクセル VBAについて教えてください

    データの一部分を取り出す方法について教えてください。     A    B    C    D    E    F ------------------------------------------ 1   1   北海道  札幌       先頭   2 2   2   青森県  青森       件数   3 3   3   岩手県  盛岡 4   4   秋田県  秋田 このようなデータがあります。 A列の番号において「F2セル」に該当する番号から 連続する件数分だけ抽出したいのですが、どのようにすればできますか。 結果としては「A2:C4」を抽出したいのです。 いろいろ検索しましたが探すことができませんでした。 どうぞよろしくご教授ください。

  • ExcelのVBAで、XMLファイルのデータ抽出

    はじめまして。 XMLファイルに含まれたデータの中から、特定の条件のデータのみを抽出するプログラムを作りたいと思っております。 XMLファイルの中身は <p name="test">あいうえお</p> <p name="test2">かきくけこ</p> <p name="test3">さしすせそ</p> … のようなデータが2~300以上あり、その中から、NAMEが"test"のものだけを抽出するプログラムなのですが、ExcelのVBAで可能でしょうか? ご教授頂ければ幸いです。よろしくお願いいたします。

  • エクセルマクロ(VBA)の立て方について

    お世話になっております。 エクセルのVBAマクロについて教えてください。 以下のように2種類A,Bの縦に並んだ時系列データがあった場合、 A No1  2012/6/1    1 A No2  2012/7/1    3 A No3 2012/8/1    4 B No1  2012/6/15   2 B No2 2012/7/15   6 B No3  2012/8/15   7 B No4  2012/9/15   9 上記のデータを別のシートに以下のように表示させたいのです。 (上記1列目は以下1列目に対応、上記4列目の数字をA、B単位で累計和を以下2列目に表示) A 1 A 4 A 8 B 2 B 8 B 15 B 24 以上のVBAマクロの数式の立て方を教えていただけますでしょうか。 よろしくお願いいたします。

  • エクセルのVBA 条件分岐について

    エクセルのVBAで、条件分岐プログラムを考えております。 セルA1に入力された数値が、 2.0以下は"B1セルの値をC1セルへコピー 数値が 5.0以上の場合は"B2セルの値をC1セルへコピー それ以外の場合は”対象外”と表示させたいのですが ご教授お願いします。 又、条件分岐後の部分『C1セルへコピー』の部分を"マクロ1を実行" "マクロ2を実行"というように、変える様な事も出来ますでしょうか? 以上よろしくお願いします。

  • VBAでEXCELファイルからデータを抽出する方法

    VBAで、サーバーにある大量のデータを含むCSVファイルから、ある条件に一致するデータを抽出する方法を教えてください。 (例)  コード   名称  在庫数  その他データ  A12300  ○○○  999   XXXXXXXX  A12400  ○○○  999   XXXXXXXX  B12500  ○○○  999   XXXXXXXX  B11100  ○○○  999   XXXXXXXX  C11200  ○○○  999   XXXXXXXX 上記データからコードの一桁目が「A」と「C」のものを抽出する場合の、VBAを教えてください。 抽出後、EXCELの別ファイルに上書き保存します。 デイリーで処理をするので、VBAで自動化したいのです。 よろしくお願い致します。

  • Excel VBA マクロ 繰り返し処理について

    初めて、ご質問させて頂きます。excel2003で、VBAによる連続繰り返し処理をしたいのですが、プログラムの知識が全くありませんので、どなたかご教授頂けませんでしょうか。 VBAによる連続繰り返し処理の内容は、excelの1つの列に上から順番に、IPアドレスを4つずつ同じ値で、入力したいのです。 例:10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.3、10.30.118.3、10.30.118.3、10.30.118.3、、、 上記の例の様に、1つの列上で上のセルから順番に、4つずつ同じ値を順番に、4000行程度入力したいのですが、手で入力するのは、大変時間がかかる為、自動で入力させたいと思っています。 恐らくfor文を使うのでしょうが、その構文がわかりません。 初心者で大変申し訳ないのですが、どなたかご教授下さい。