• ベストアンサー

(Excel VBA)困っています・・・orz

エクセルを使うとある業務でマクロを組み、最適化を図ろうと試みているのですが 気がつけば高度な領域に突入していまして、僕みたいなレベルじゃ全然???な状況になってしまいました。 まず A列の1行目から任意の行に(10行までしかなかったり、1000行まであったりとランダムにあるとする)、任意の文字列(ABCなど)があるとします。 それからオートフィルタを使い、A列からある任意の文字列(ABCなど)を検索条件にしてデータを抽出します。 抽出されたデータベースのA列には検索条件にある「ABC」が任意の行まであり、その抽出されたデーターベースのD列に今度は「XYZ」とという文字列を 抽出された分の最終行まで割り振る・・・ つまりA列《ABC》で検索され抽出されたデータのD列には《XYZ》が自動に入力される もし、検索条件(ABC)で抽出されたデータが「0」件だった場合は、D列には何もせず、次の検索条件に進む・・・ というものをマクロで組みたいのですがどうやったらよいのでしょうか?? 何卒、ご教授お願い致します。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

こんなもんでいかがでしょうか。SpecialCells(xlCellTypeVisible)も考えましたが、見つからないときの処理が面倒になりそうです。ご参考まで。 Sub test() Dim targetRange As Range Dim i As Long Set targetRange = Range(Range("A1"), Range("A" & ActiveSheet.Rows.Count).End(xlUp)) With targetRange .AutoFilter Field:=1, Criteria1:="ABC*" For i = 2 To .Rows.Count If .Cells(i).EntireRow.Hidden = False Then .Cells(i).Offset(0, 3).Value = "XYZ" Next End With End Sub

rozzer
質問者

お礼

mitarashiさん、ご回答ありがとう御座います。 素晴らしいです! 僕が求めていたのは当にこの様な動きです。 本当に皆さん天才ですね!頭が下がります・・・orz 余談ですが、質問時に一つ言い忘れていました。 D列に「XYZ」という文字列が自動に入力されるのと同時に R列にも「1」という文字列が入る様に、、と書き忘れていました。。。orz そこでmitarashiさんが書いて下さった構文からヒントを得てコピペしてみました。 Sub test() Dim targetRange As Range Dim i As Long Set targetRange = Range(Range("A1"), Range("A" & ActiveSheet.Rows.Count).End(xlUp)) With targetRange .AutoFilter Field:=1, Criteria1:="ABC*" For i = 2 To .Rows.Count If .Cells(i).EntireRow.Hidden = False Then .Cells(i).Offset(0, 3).Value = "XYZ" If .Cells(i).EntireRow.Hidden = False Then .Cells(i).Offset(0, 17).Value = "1" Next End With End Sub そのまま拝借させて使わしてもらいます! 本当にありがとう御座います!m(_ _)m

その他の回答 (5)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.6

質問の処理を行うだけなら・・・ Sub test() Dim 検索値 As String Dim 入力値 As String Dim i As Long 検索値 = InputBox("検索値を入力してください") 入力値 = InputBox("入力値を入力してください") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If InStr(Cells(i, 1).Value, 検索値) = 1 Then Cells(i, 4).Value = 入力値 Next i '抽出表示が必要なら、ここで抽出(オートフィルタ)すれば '抽出だけの処理になるので簡単 End Sub 実用的なコードは他に回答があるので 考え方のヒントにでもなれば幸いです 参考まで

rozzer
質問者

お礼

hige_082さん、ご回答ありがとう御座います。 ご返信が遅くなりましてすみません。 なるほど!この様な方法もあるのですね! hige_082さんが書かれたプログラムもスッキリしていて綺麗で分かり易いですね! とても参考になります! 実はまた解らない問題が2点ほど発生してしまいまして・・・ オートフィルタの複数条件でInputBoxを使った方法で対応出来るかどうかで、今現在自分なりに試行錯誤しているですが・・。 恐らくまた皆さんの天才的なお知恵を、恐れ多くもまたまたお借りするかも知れません...orz 書かれて下さったこの構文も、とても参考になります! 本当にどうもありがとう御座います! 徹夜明けなので頭の回転が悪く、文章が非常に拙く読み辛いかもしれませんが何卒お許し下さい。。。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

先ず、基本的な方法から試してみたらどうでしょうか。 G列(2行目以降)に、検索文字 H列(2行目以降)に、置換文字 をそれぞれに必要分セットしておいて '------------------------------------ Sub test()  Dim R As Long  Dim K As Long  For R = 2 To Cells(Rows.Count, "A").End(xlUp).Row    For K = 2 To Cells(Rows.Count, "G").End(xlUp).Row      If Cells(R, "A").Value = Cells(K, "G").Value Then        Cells(R, "D").Value = Cells(K, "H").Value      End If    Next K  Next R  MsgBox "終了" End Sub '--------------------------------- ま、こんな簡単なのはご存知でしょうから、質問の件になったのでしょうが、、 以上です。

rozzer
質問者

お礼

myRangeさん、ご回答ありがとうございます。 いえいえとんでもないです、わざわざ私如きの質問にお知恵をお貸し頂いただけでも本当に嬉しいです! 余白のセルに必要分の値をセット・・・ それが出来たら本当に良かったのですが、仕様上、不可視な状態で組まなければならないので本当に困りものでした。。orz ですが、皆さんが天才的なお知恵をご提供して下さったお陰で何とかなりそうです。 本当にありがとう御座います!m(_ _)m

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.4

#2です。 みつからなかった時の処理も必要なことを忘れてました。 改良してみましたので、ご参考までに。 Sub test2()   Dim myFindKey, mySetKey   Dim myLastRow As Long      With ActiveSheet     Do       If .AutoFilterMode Then .AutoFilterMode = False       myLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row       myFindKey = Application.InputBox(prompt:="検索文字は?", Type:=2)       If myFindKey = False Then Exit Do       .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=myFindKey       If .Range("A1:A" & myLastRow).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then         mySetKey = Application.InputBox(prompt:="入力文字は?", Type:=2)         If mySetKey = False Then Exit Do         .Range("D2:D" & myLastRow).SpecialCells(xlCellTypeVisible).Value = mySetKey         Exit Do       End If     Loop     .AutoFilterMode = False   End With End Sub

rozzer
質問者

お礼

ka_na_deさん、ご回答ありがとうございます。 mitarashiさんのとも甲乙付けがたいほど、素晴らしい構文ですね! 特にインプットボックスがあるところについては、抽出するデータベースの文字列に変更があった場合は、柔軟に対応出来るところから、当に感嘆ものです! 本当に天才ですね皆さん! ・・・それに比べて僕なんてまだまだです orz ka_na_deさんとmitarashiさんの2つのプログラムを両方とも採用させて頂く事にしました。 状況に応じて使い分けられるように少し改良させて頂きます! 皆さんにお忙しい中、本当にありがとう御座います!m(_ _)m

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.2

オートフィルターを使った一例です。 一行目は見出し行である前提です。 参考になれば幸いです。 Sub test()   Dim myFindKey As String   Dim mySetKey As String   Dim myLastRow As Long   myFindKey = "ABC"   mySetKey = "XYZ"   myLastRow = Cells(Rows.Count, "A").End(xlUp).Row   With ActiveSheet     If .AutoFilterMode Then .AutoFilterMode = False     .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=myFindKey     .Range("D2:D" & myLastRow).SpecialCells(xlCellTypeVisible).Value = mySetKey     .AutoFilterMode = False   End With    End Sub

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

> マクロで組みたいのですがどうやったらよいのでしょうか?? 「マクロの記録」を実行してコード生成させて、内容を検討して手直し。 ポイントは、 1)列Aに対する条件である「任意の文字列」をどう受け取る? 2)列Dに設定する「任意の文字列」をどう受け取る? 3)「任意の文字列」に対する実行は終了はどう判定する? 4)任意の「入力行数」を知るにはどうする? 4)任意の「入力行数」を知るにはどうする?で行数さえわかれば、  a)セルD1~セルD<入力行数>まで判定するループ処理を作成。  b)セルD<対象行>が設定されている(他条件の判定済)なら次行へ、    セルD<対象行>が値設定されてないなら以下を実行後、次の行へ。  c)セルA<対象行>が判定条件に一致していれば、値を設定。  d)判定条件が終了でなければa)へ戻る ですかね。

rozzer
質問者

お礼

ご回答ありがとう御座います。 そうなんです・・bin-chanさんの言う通り、僕も頭の中ではその概念で構成しているんですが、いざ構文で表す、、となると全然わかりません。。。orz ちなみに >4)任意の「入力行数」を知るにはどうする?で行数さえわかれば これはRows.countで何とかなりませんかね? A列の任意の行まで入力されている文字列(値)を入力されている最終行までの取得は出来るのですが それを「ABC=XYZ」と判定し、D列にA列で抽出された分だけ「XYZ」を入れるという方法が如何せんどうしたものか...

関連するQ&A

  • VBAマクロ抽出の記述

    A列からAH列の6行目からデーターベースが入っています。 条件としてAH列6行目の欄にKという文字で F列~AC列までのデータがブランク以外のデータを抽出したい。 このマクロの記述の仕方を教えてください。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • 【Excel VBA】条件つき行削除

    Excel2003を使用しています。 システムからCSVで落としたデータで、データの並び方に規則性があるので、それを利用して、不要部分のデータをマクロで削除できないかと思い、質問させていただきます。 A列に『累計』を含む文字があった場合、その行のD列が0だったら、その行より上の行のA列に『計上日』と入力されている行までを削除するということをしたいです。 下記でいうと、2~5行までを削除したいです。    A     B     C     D 1 2 計上日 3 4 5 累計                0 6 7 計上日 8 9 累計              1000 上記では、B列、C列には何も書いていませんが、実際はデータが入力されていたり、空欄だったりです。 D列が0の行を削除するコードはわかるのですが、さらに、条件が加わっても同じように処理は可能でしょうか? よろしくお願いします。

  • Excel2003に関しての質問です。

    Excel2003に関しての質問です。 A列の各セルごとに数字や文字など、さまざまな文字列が存在したBookにて、 『数字が8個連なった行のみを抽出し、ほかの行は削除する』ことはできるでしょうか? たとえば添付のようなものです。 添付画像は2007ですが、会社のは2003なので… この場合は、2.3行目や5.6行目などを抽出し、ほかのデータは削除したいのです。 また、この抽出作業をマクロ記憶しておき、手間を省きたいと思っています。 面倒なのが、データの個数が日々増減しているので、 Aの○○行を毎回消せば大丈夫!というものでもないので、困っています。 どなたかご教示ください…

  • オートフィルタ後の、マクロでの値の参照に関して

    オートフィルタ後の、マクロでの値の参照に関して 下記を悩んでいます。教えて頂ければ幸いです。 マクロで、あるデーター表から、オートフィルタを使用し、必要なデーターを 抽出し、マクロ内に戻し、その後の計算で使用したいと考えています。 A列、B列、C列にそれぞれ、検索条件を指定し、オートフィルタ後、下記のような状態になります。 参照したい値は、D列になります。 下記のような例では、2.5と2.7の値をマクロ内に戻したいです。 (例:オートフィルタ後) 1行  A▼  B▼  C▼  D 16行 **  **   **  2.5   20行 **  **   **  2.7 *2~15行目は見えなくなっています。 *17~19行目は見えなくなっています。 セルを参照し、マクロ内に戻すには、どのような構文(マクロ)の記述が必要でしょうか? 【備考】 ・上記の例では、セルはD16、D20となりますが、抽出条件によっては、行番号が変わってしまいます。 ・抽出後のD列のデーター数は、常に2つです。 よろしくお願いします。

  • (Excel VBA)またまた困っています・・・ o...rz

    どうもrozzerです。 またもや高くそびえ立つVBの壁に激突して死にかけてしまっています・・・orz 今度は単純なマクロだと高を括っていたので鼻歌交じりでマクロを組んでいたのですが どうも如何せん上手くいきません! もう死にたいです! 現在エクセルで、とある業務で使うデータベースをマクロを組み最適化を図っています。 まず A列の2行目から任意の行に(10行までしかなかったり、1000行まであったりとランダムにあるとする)、任意の整数値があるとします。 その値の合計を、セル【B1】に表示させたいのです。 ですが、ここで問題なのですがセル【B1】に入力される式はSUM等の関数式ではなく、ただの「数値」として表示させたいのです。 つまりA列の2行目から任意の行(最終行まで)に入力されている整数値に、後々、変更があった場合に【B1】に表示されている値が、一番初めに合計の値をはじき出した値から変化しない様にしたいのです。 そして今度はセル【C1】に、A列の2行目から任意の行(最終行)までの合計値を「SUBTOTAL」関数[=subtotal(9,C1:**)]を入力したいのです。 ここまでの動作をマクロ化したいのですが、どうも如何せんどうも如何せん上手くいきません! もう死にたいです! 何卒、ご教授頂けましたら幸いで御座います。

  • 【Excel VBA】条件を満たすデータを順に抽出

    Excel2003を使用しています。 CSVでExcelに取り込んだデータの中から、条件を満たすものを順に抽出して一覧表を作成するマクロを作りたいのですが。。。 ・Sheet2のB列に“コード”と入力されている行のC列のデータ → Sheet1のC列2行目以下 ・Sheet2のC列に“合計”と入力されている行のD列のデータ → Sheet1のD列2行目以下 に順に表示させたいのですが、うまくいきません。 以前、いただいた回答で参考になりそうなものを見てみたのですが、手順というか何かヒントのようなものをいただけたら、自分でどうにかできそうなので、質問させていただきました。 よろしくお願いします。

  • シート内の抽出について(Excel)

    シート内の抽出について(Excel) シート内に同じ文字列が複数存在するデータから抽出して使用したいのですが、ご存知の方おりましたら教えていただきたいのですが。 例    A   B   C   D  1 001  ABC 500  太郎 2 001  ABC 200  花子 3 001  ABC 150  太郎 4 002  DEF 500  次郎 5 002  DEF 200  三郎 6 002  DEF 150  次郎 7 002  DEF 100  次郎 このようなシートがあったとしますと 抽出条件として ’001’ とした場合 番号:001    A   B   C   D  1 001  ABC 500  太郎 2 001  ABC 200  花子 3 001  ABC 150  太郎 このように他のシートに抽出できればベストなのです。 データーが膨大なものでオートフィルターで抽出しコピー&ペーストでは時間がかかり過ぎてしまいます。関数でなんとかなればと思っておりますがお知恵をかしていただけないでしょうか?

  • VBAでのデータ並び替え、条件判断について

    Excel2003、VBA6.5でマクロに挑戦しているVBA初心者です。 学生時代にプログラムはかじった事があるのですが、マクロは勝手が分からず、 以下のようなマクロを組みたいのですが、そもそもプログラムはどこの ウィンドウに書くのか?という辺りから調べ出す始末のため、皆様の お知恵をお借りしたく、投稿しました。 【目的】 Sheet1に貼り付けられたデータを、精査(並び替え、条件判断)し、結果をSheet2に出力させたい。 Sheet1(入力データ) 1行目は項目名 データA1,データB1,データC1,データD1,データE1 データA2,データB2,データC2,データD2,データE2 … … データA11,データB11,データC12,データD11,データE11 データA12,データB12,データC12,データD12,データE12 ※データEのみ、整数型で後は文字データになります。  また行数というか、データ量は20~30行程度を想定してます。 Sheet2(出力データ) 1行目は項目名 日付,データB1+データC1の文字列を結合,固定値2,条件判断結果1(データD1より条件判断) 日付,データB2+データC2の文字列を結合,固定値2,条件判断結果2(データD2より条件判断) … ※Sheet1のデータ1行は、すべてが必要でありません。一部のみがあればOKです。  上記の例だと、Sheet1のデータAとEはSheet2では不要です。 ※日付…マクロを走らせた日付をMM/DD形式で出力させたい ※条件判断結果…(データD1がAMだったら09:00、PMだったら13:00、PM2だったら15:00という値を返すようにしたい) 流れを考えてみましたが、 1)データ型を宣言して、 2)1行を配列に読み込む 3) a)データB列、C列の文字列を結合  b)データD列の条件分岐 4)配列からデータを書き出す 5)Sheet1の行が空白だったら処理完了 という感じかと思っているのですが、具体的にマクロにできず(関数をうまく使えず)、困っています。 Findメソッドか、Vlookupあたりで必要になるデータだけ、Sheet1で検索した結果をSheet2に埋めて 行く形でもできるのかな、とも思いましたが、こちらも具体的にマクロにできません。 特に処理スピードにこだわるわけではないですが、あとあと見返して勉強およびメンテできるような、 シンプルなカタチ(1行にコマンドを詰め込んだ複雑な形ではなく)にしていただけると助かります。 どうぞご教授いただけませんでしょうか。 よろしくお願いいたします。

  • excel2000、フィルタオプションの使い方について

    こんにちわ。 私はデータベースの同一項目の中から、 複数の要素を「含まない」ものを抽出したいと思っています。 要素が5つくらいあるのでオートフィルタではまかないきれませんで、フィルタオプションでデータベース化 させたいのですが、要素が文字列なせいかうまくいかないのです。 maruru01さんというかたに教えていただいたとおりにとりあえず > 文字列データの場合は一筋縄ではいきません。 > それぞれ、セルに > 「="<>*a*"」(aを含まない) > のように入力する必要があります。 > > それから、同一の項目(データという名前とする)で複数を同時に含まないという条件(AND条件)は、 > > データ データ データ >  a    b    c > > とその項目を複数横(列方向)に並べます。 > (いちいち項目名を付ける必要があります。) > のようにやってみたつもりなのですが、さっぱりうまくいきません。(少なくとも、要素1つだけなら上手くいったが2つ以上だと「含まない」抽出にならないのです) 5つ以上の要素を「含まない」ものを抽出させるには、 どう書式を作ればいいのでしょうか? エクセルでの簡易データベース作りの経験者の方、 ぜひご指導をよろしくお願いします

専門家に質問してみよう