Excel VBA 列の値を調べてフラグ立て

このQ&Aのポイント
  • Excelシートの列の値を調べて、特定の条件に基づいてフラグを立てるVBAのコードを教えてください。
  • データが入っている列の右端を調べ、そのさらに右の列を入力列として使用します。B列のデータの左から3文字を検査し、特定の文字列に一致した場合にフラグを立てます。また、B列の先頭3文字に特定の文字列が含まれる場合にもフラグを立てます。最終行の検証が終わったら処理を終了します。
  • Excelシートの特定の列の値を調べて、条件に基づいてフラグを立てるVBAのコードを作成したいです。具体的な要件は以下の通りです。1. データが入っている列の右端を調べ、その右の列を入力列とします。2. B列のデータの左から3文字を検査し、特定の文字列に一致した場合にフラグを立てます。3. B列の先頭3文字に特定の文字列が含まれる場合にもフラグを立てます。4. 最終行の検証が終わったら処理を終了します。
回答を見る
  • ベストアンサー

Excel VBA 列の値を調べてフラグ立て

図のようなリストのB列に商品番号が入っています。 ただし ・シリアル(番号)はB列に入っている(固定) ・データの最終行は未定(表による) ・データのある右端の列も未定(表による) このようなシートに対して、次のような操作ができるVBAのコードを教えてください。 1. データが入っている列の右端を調べ、そのさらに右列を入力列とする (ここではF、罫線など書式設定は不要) 2. B列(シリアル)のデータの左から3文字を検査し、ABCとなっている行は◯を入力する 3. B列の頭3文字のうち、XXの2文字がある場合(XXZでもAZZも=緑)、Aを入力する 4. B列の頭4文字以右に該当文字(ABCやXX)があっても該当しない(ピンクは対象外)。 5. 最終行の検証が終わったら終了(ここでは12行目が最終行) お時間のあるときでいいので、よろしくお願いします。 Excel 2010 or 2013

  • ketae
  • お礼率86% (295/343)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.2

以下でいかがでしょう。 Sub Example() Dim MyLastRow As Long, MyLastColumn As Long Dim i As Long MyLastColumn = Cells(3, Columns.Count).End(xlToLeft).Column '3行目の備考以降右にデータのあるセルがある場合Columns.Countをデータのあるセルの左のセルを指定 'たとえばK3にデータがある場合 Cells(3, "J").End(xlToLeft).Column MyLastRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の必要なデータがある行以降にデータがある場合Rows.Countを列の場合と同じように適宜変更してください。 For i = 4 To MyLastRow If Left(Cells(i, "B").Value, 3) Like "ABC" Then Cells(i, MyLastColumn + 1).Value = "○" ElseIf Left(Cells(i, "B").Value, 3) Like "*XX*" Then Cells(i, MyLastColumn + 1).Value = "A" End If Next End Sub

ketae
質問者

お礼

ありがとうございました。

ketae
質問者

補足

動作しました。 1点確認をさせてください。 |MyLastColumn = Cells(3, Columns.Count).End(xlToLeft).Column |'3行目の備考以降右にデータのあるセルがある場合Columns.Count |をデータのあるセルの左のセルを指定 |'たとえばK3にデータがある場合 Cells(3, "J").End(xlToLeft).Column とあるところの「'たとえばK3にデータがある場合 Cells(3, "J").End(xlToLeft).Column」の説明が理解できませんでした。 Columns.Countで列の最大(最終列)を指定し、 そこから End(xlToLeft).Column でデータのある最終列を探していると思います。そのためK3[備考]をそのまま認識していると思われます。 K3に[備考]とその列があった場合、"J"は何を意味されていらっしゃるのでしょうか。 時間のあるとき、ご教授お願いいたします。

その他の回答 (4)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答No.1、4です。  他にも次の様な方法もあります。 Sub QNo9221617_Excel_VBA_列の値を調べてフラグ立て_別法() Const FirstColumn = "A" '表の中で一番左端の列の列番号 Const SearchColumn = "B" 'シリアル(番号)が入力されているの列の列番号 Dim InputColumn As Long, SearchString(1) As String, OutputString(1) As String _ , LastRow As Long, c As Range SearchString(0) = "ABC" '検索する文字列その1 SearchString(1) = "XX" '検索するの文字列その2 OutputString(0) = "◯" '検索するの文字列その1が見つかった場合に出力する値 OutputString(1) = "A" '検索するの文字列その2が見つかった場合に出力する値 InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(FirstColumn).column + 1 Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For Each c In Range(SearchColumn & ItemRow + 1 & ":" & SearchColumn & LastRow) If c.Value Like SearchString(0) & "*" Then Cells(c.row, InputColumn).Value = OutputString(0) If c.Value Like SearchString(1) & "*" Or c.Value Like "?" & SearchString(1) & "*" Then _ Cells(c.row, InputColumn).Value = OutputString(1) Next c With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

ketae
質問者

お礼

SearchStringは初めてみたので、覚えておこうと思います。 ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答No.1です。 >変数未定義エラーが出たのですが  失礼致しました。試作したVBAの構文の中から結局使わないで済んだ不要な変数を削除してまとめて行く段階で、誤ってLastRowの宣言まで消してしまっておりました。  一応動作チェックはしていたのですが、当方が使用しているExcel2010では変数が未定義でも動作することはするので気づきませんでした。 >LastRowをLongで宣言したところ動作しました。 との事ですので、自力で修正してしまわれたため質問者様にはもう不要の事かも知れませんが、一応念のために修正版を投稿しておきます。 Sub QNo9221617_Excel_VBA_列の値を調べてフラグ立て() Const FirstColumn = "A" '表の中で一番左端の列の列番号 Const SearchColumn = "B" 'シリアル(番号)が入力されているの列の列番号 Const ItemRow = 3 '表中で項目名が入力されている行の行番号 Const myLength = 3 'シリアルの中で検索対象とする頭文字の長さ Dim InputColumn As Long, SearchString(1) As String, OutputString(1) As String _ , LastRow As Long, buf As Variant, temp As Variant, i As Long, j As Long SearchString(0) = "ABC" '検索する文字列その1 SearchString(1) = "XX" '検索するの文字列その2 OutputString(0) = "◯" '検索するの文字列その1が見つかった場合に出力する値 OutputString(1) = "A" '検索するの文字列その2が見つかった場合に出力する値 InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(FirstColumn).column + 1 Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow buf = Left(Range(SearchColumn & i).Value, myLength) If buf <> "" Then For j = 0 To 1 temp = InStr(buf & "", SearchString(j)) If temp > 0 Then Cells(i, InputColumn).Value = OutputString(j) Next j End If Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

ketae
質問者

お礼

再度ありがとうございます。 2007以降そんなに問題が起こらないような気もしていましたが、コードのほかツールバーやリボンあたりの呼び出しが変わっているので、2010も含めてバージョン現物で1つ1つ確認すべきでした。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.3

> とあるところの「'たとえばK3にデータがある場合 Cells(3, "J").End(xlToLeft).Column」の説明が理解できませんでした。 画像の表ではE3が備考で最終右列ですが、それより右(たとえばK3)になにかしらのデータ(備考列ではなく)があった場合、Columns.Count列から探すとK列が最終右列となり実際の備考列と合致しないので、Columns.Count列からではなくJ列から左に向かって現在の表の再右列(備考列)を探してくださいということで、今の表の備考列がK3にあればということではなく、説明が不十分で失礼しました。

ketae
質問者

お礼

了解しました。 問題なく動作しています。考え方はこのやり方がよさそうです。ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 以下の様なVBAでは如何でしょうか。 Sub QNo9221617_Excel_VBA_列の値を調べてフラグ立て() Const FirstColumn = "A" '表の中で一番左端の列の列番号 Const SearchColumn = "B" 'シリアル(番号)が入力されているの列の列番号 Const ItemRow = 3 '表中で項目名が入力されている行の行番号 Const myLength = 3 'シリアルの中で検索対象とする頭文字の長さ Dim InputColumn As Long, SearchString(1) As String, OutputString(1) As String _ , buf As Variant, temp As Variant, i As Long, j As Long SearchString(0) = "ABC" '検索する文字列その1 SearchString(1) = "XX" '検索するの文字列その2 OutputString(0) = "◯" '検索するの文字列その1が見つかった場合に出力する値 OutputString(1) = "A" '検索するの文字列その2が見つかった場合に出力する値 InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(FirstColumn).column + 1 Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow buf = Left(Range(SearchColumn & i).Value, myLength) If buf <> "" Then For j = 0 To 1 temp = InStr(buf & "", SearchString(j)) If temp > 0 Then Cells(i, InputColumn).Value = OutputString(j) Next j End If Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

ketae
質問者

お礼

ありがとうございます。変数未定義エラーが出たのですが、LastRowをLongで宣言したところ動作しました。

関連するQ&A

  • Excel VBA 日付けでIF/Else仕訳

    図のようなリストがあります。 「発売日」の日付けを判断するVBAを教えてください。 ・オレンジ色のセルと「発売日」のE列は固定で移動しません。 ・データの最終行は未定(表による、ここでは17行目、No.13が最後のデータ) ・データのある右端の列も未定(表による) ・表のタイトル行(No. シリアル・・・)は固定(4行目) このようなシートに対して、次のような操作ができるVBAのコードを教えてください。 1. 「発売日」のE列を調べ、"G1"の"EOL最終日"と比較し、こお日"以前"の行は、  右端に"EOL"と入力する (EOLとは「End Of Life」で、部品サプライヤーが部品供給を終わったことを意味します) 2. "G1"の日付けの翌日から"G2"の日付け(当日含む)までの期間にある部品は現行品のため、"現行品"と入力する 3.E列でどちらにも該当しない入力、空欄、ゴミ入力などは”N/A”と入力する(これはElseでよい) 表の右端は現在の表ではF列の「備考」列ですが、表によっては誰かが列を増やしている可能性があるため、上記の入力は列の右の空いている未使用列に入力したい。 日付け形式で入力された列の、If / Elseif/ Else判定の仕方がわからずこまっています。 よろしくお願いします。

  • エクセル 入力に関する関数の使い方

    E8の文字が  縦6列 横10行の表の中で ある文字に該当したら 右端の文字を E10に 入力する方法を教えてください。 下の例ですと 「あ」に該当したら 「-」を入力する  あ い う え お A -  か き く け こ B +      ~            ~  は ひ ふ へ ほ J +  

  • EXCEL VBAで文字列の検索とコピー

    検索したい文字をinputboxで入力して、A列を検索して、検索文字を含むセルをコピーして、そのコピーしたデータを、別のシートに貼り付ける、次に該当したセルをさっきコピーしたデータの次の行に貼り付けて・・・。とデータが入力してある最終行までの繰り返し、をやりたいのですが、ご指導の程、説明が下手ですが宜しくお願いします!

  • Excel 隣接しない列に値貼り付け

    Excel 隣接しない列に値貼り付け ※「Excel 隣接しない列に一発で値貼り付け」の書き直しです。 ある一定の書式にしたがって作成された20~30のシートのデータを1つのシートに集約しており(集約シートを含み全てのシートは同じデータ内です。)、データを集約した集約シートの「表A」は下記の添付画像左側のようになります。 やりたいことは、「表A」のB列、C列、D列、E列をある条件のもとに右側の「表B」のH列、J列、L列、N列に値の貼り付けを行いたいのです。 現在の作業工程は、C列の空白行は必要ないため(C列が空白=他の列も空白)C列に文字入力があるとチェックが入るA列のオートフィルターで、「○」のみ表示にし、B~E列を順にそれぞれ、2行目からデータが記載された最終行までコピーし 「表B」のそれぞれの箇所に値貼り付けを行っています。 この時の注意点として、A列のオートフィルタ利用のためC列には空白がありませんが、B、D、E列には空白が存在します。 データがある最終行以下の空白は必要ありませんが、データ間の空白には意味があります。(下記の図で示すと「B3、4」や「D3、4」) 現在の作業工程でも問題はないのですが、この作業は最初に記載した20~30のシートに記載されたデータの校正に使うため取りこぼしをしたくなく、不特定多数の方が簡単に使えるようにしたいので、どうにか作業工程を減らしたいと考えています。 よろしくお願いします。 ▼書式シート *シートの数は増減する。 *集約シートが参照するセルには、必ずデータが入力されているわけではない。 *入力データは全て数値ではなく文字である。 ▼集約シート *他のブックと共通使用なため、一部の式は他のブックへのコピーに対応する形である。 *空白セルを参照している場合に結果として返される「0」は、オプション設定で非表示にて対応 *「表A」の行長は増減する。 *貼り付け先「表B」の列は飛び飛びである。 ▼ちなみに「表A」に使われている計算式(実際とは一部変えています) ■A列  :C列に文字入力がある場合「○」が表示されます     {=IF(OR($C1>""),"○","")} ■B-E列:他のシートの任意のセルの値をコピー     {=IF(ISERROR(INDIRECT("'シート名'!セル")),"",INDIRECT("'シート名'!セル"))} PC環境:Win XP / Excel 2003

  • A列にある文字データで△△を含むセルの値をB列に□□にして置き換えしたい

    A列に文字データが100行まであります。    A           B    1 ミカンを食べた     ZZ 2 イチゴを食べた     XX 3 西瓜を食べた      YY 4 ミカンを捨てた     ZZ 5 西瓜を拾った      YY 6 ミカンを無くした    ZZ 7 西瓜を貰った      YY 8 イチゴをあげた     XX それを表のようにB列(任意の列)に置き換えたいです。 イチゴを含むセルはB列にXXをミカンはZZみたいな感じです。 A列のセルには同じ文字列は(今のところ)含みません。 文字の一部を置き換えて変換し、それを繰り返すところまではできましたが、上記のことがができません。 VBAを使って一発で変換したいのですが教えていただけますでしょうか?

  • エクセルVBAによるマトリクス表の縦配列

    エクセルVBAで以下のような処理を行うプログラムを作成したいのですが、 シロウトなんで、なかなかスマートに作れません。 どのようにすればいいかご教示いただけたら有り難いです。 (1)下記のように、縦横のマトリクス表にデータが入力されている。   A B C ・・ 1 2 3 ・ ・ (2)これを別シートに縦に2列にデータを並べるように処理する。  左列には"列項目&行項目"、右列には該当するデータをセットする。 A1  A1のデータ A2  A2のデータ  A3  A3のデータ ・   ・ B1  B1のデータ ・   ・ ・   ・ (3)尚、列項目(A.B.C...)と行項目(1.2.3...)の項目数は不定で、セルが空白になるまで、 処理を繰り返すかたちにする。 以上のような条件ですが、よろしくお願い致します。

  • Excel 同じ値の列を一行表示

    教えて下さい。 同じ列に複数の同じ値があり、その値を一つの行で表示する場合。 (グループ化でしょうか?グループ化を試しましたが、うまく纏まりません。グループ化の主キーの設定??) また、その中からの値を検索して別の表に取り出すには、どうしたらよいでしょうか? 例)       1 あ A zz  →  A  → A 1 あ 2 い B vv  →  B  → B 2 い 3 う C xx  →  C  → C 3 う 2 い B vv 3 う C xx 1 あ A zz (1)3列目の複数ある値を一つにまとめる。 (2)他のシートに纏めてある表(3列目の値が主キーなっている表)に  纏めた値に対する情報を追加入力したい。  *値を返すのは別のシートです。 うまく説明が出来ず分かりづらいと思いますが、よろしくお願いします。

  • EXCELで列の値を返す関数

    いつもお世話になっております。 EXCELで表をつくり、一番新しいデータが入力されている列の値を返したいのです。具体的には、   A  B  C  D  E   D  東京 大阪 名古屋 広島 福岡 1 120円   450円     ←側から見て一番最初の入力情報の列 2    50円     20円 3       10円 4             120円 上の表の場合、 1行目の場合は名古屋 2行目は広島 3行目は名古屋 4行目は福岡という値をD列に返したいのです。 関数または、マクロをご教示くださいますよう、お願いいたします。

  • Excel VBA - 数式のコピーと値貼り付け

    A~Cを使った表があり、AとBには値が入力されています。 C2に"=A2+B2"と入力し、その式を、A列の最終行と同じ行までコピーし、C2からCの最終行までの範囲をコピーして同じ範囲に値貼り付けするにはどういうVBAを書けばいいでしょうか。 宜しくお願い致します。

  • エクセルVBAの初心者です

    エクセルにあるデータの一覧表からB列からW列にある最終行から上に10行の範囲を選択してコピーするにはどう書いたらいいのですか。教えてください。宜しくお願いします。

専門家に質問してみよう