エクセルVBA条件セル検索時連続時処理中止と列複数
- Excel2013のVBAで条件セル検索時に、連続している場合は処理を中止する方法について教えてください。
- また、複数の列に対してコードを適用する方法も教えてください。
- お手数をおかけしますが、ご教授よろしくお願いいたします。
- ベストアンサー
エクセルVBA条件セル検索時連続時処理中止と列複数
いつもお世話になっております。 Excel2013のVBAでまた質問があります。お願いいたします。 ある表のにある値が入力されていたら、その値をコピーして1行上の4列右の列に貼り付け、もとの行の値を削除するように色々参考にしながら作りました。 ある値を例えば、"AAA”と"BBB"だとして、下記コードでなんとか最初の段階が実現できました。 あと、やりたいのは、条件を検索する列の、"AAA"もしくは"BBB"の値が連続している場合は、メッセージを出して、処理を中止にしたいです。単体で連続でも2つの組み合わせでも、この2つのうちいずれかが入力されている行が続いていたら中止です。 あと、最初にWorksheets("Sheet1").UsedRange.Columns(5)列目を指定しているんですが、実際は、複数の列を指定したいです。コピーしたり消去したりのオフセットの位置関係は変わりません。 必要なら、名前を定義して、一括で指定するのも大丈夫です。 お手数をおかけしますが、ご教授よろしくお願いいたします。 Sub TEST() Dim c As Range Dim firstAddress As String ' ActiveSheet.UsedRange.Select With Worksheets("Sheet1").UsedRange.Columns(5) Set c = .Find(What:="AAA", _ LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then firstAddress = c.Address Do Range(c.Address, Range(c.Address).Offset(0, 1)).Copy Range(c.Address).Offset(-1, 4) Range(Range(c.Address).Offset(0, -1), Range(c.Address).Offset(0, 6)).ClearContents Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop Until c.Address = firstAddress End If '別条件でもう一度 Set c = .Find(What:="BBB", _ LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then firstAddress = c.Address Do Range(c.Address, Range(c.Address).Offset(0, 1)).Copy Range(c.Address).Offset(-1, 4) Range(Range(c.Address).Offset(0, -1), Range(c.Address).Offset(0, 6)).ClearContents Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop Until c.Address = firstAddress End If End With End Sub
- hinoki24
- お礼率61% (106/171)
- Excel(エクセル)
- 回答数2
- ありがとう数8
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>実際は、複数の列を指定したいです 具体的にどこ列範囲を対象にしたいのでしょう。 AAAやBBBは右4の列に「コピー」されますから、不定の列からAAA・BBBを探して上1右4にコピーしたのを「対象から外す」必要があるハズです。その辺の、やるヤラナイ列関係の条件がありませんね。 また複数列を対象にした際、「連続する」のが縦に繋がってる限定でいいのかちょっと曖昧です。 データが実際に何行から開始されてるのかも情報がありません。 sub macro1() dim a as variant dim buf as variant dim c as range a = array("AAA", "BBB") with worksheets("Sheet1").range("D:F") ’仮にD,E,F列 for each buf in a set c = .find(what:=buf, lookin:=xlvalues, lookat:=xlwhole) do until c is nothing ’全部処理して無くなるまでループ ’一つ上と一つ下を検査 if not iserror(application.match(c.offset(-1).value, a, 0)) _ or not iserror(application.match(c.offset(1).value, a, 0)) then c.offset(-1).resize(3, 1).select msgbox "STOP" exit sub end if c.offset(-1, 4).value = c.value ’上1右4に転記 c.offset(0, -1).resize(1, 7).clearcontents ’左1から7セル消去 set c = .findnext(c) loop next end with end sub
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7940)
ご相談にあれもこれも詰め込みしてるので、状況説明も足らず回答も薄くなります。 元々のご質問内容の「連続してたら打ち切り」が解決したのでしたら、それで一回終了して欲しいです。 ホントにF,O,X列でいいのか疑問ですが、自力で適切に応用してください。 変更前: with worksheets("Sheet1").range("D:F") ’仮にD,E,F列 変更後: with worksheets("Sheet1").range("F:F,O:O,X:X") あるいは with worksheets("Sheet1").range("対象範囲の名前定義") それからこれも、ご相談に何の説明もありませんが。 変更前: c.offset(-1, 4).value = c.value ’上1右4に転記 変更後: c.offset(-1, 4).resize(1, 2).value = c.resize(1, 2).value
お礼
お手数をおかけしてすいませんでした。 見事にできました。 どうもありがとうございました。
関連するQ&A
- エクセル:セルの検索
Sheet1のC~G列を検索し、 [AAA]が見つかれば「成功」、見つからなければ「失敗」と表示するコードを作りました。 (実際のコードでは、AAAが見つかったセルBBBの.Addressや.Valueを使いたいので「Set BBB」などという書き方をしています) Dim AAA As String Dim BBB As Range Set BBB = Worksheets("Sheet1").Range("C:G").CurrentRegion.Find(What:=AAA, LookAt:=xlWhole) If BBB Is Nothing Then MsgBox "検索に失敗" Else MsgBox "検索に成功" End If このコードで、C~D列にAAAがある場合は見つかるのですが、 E~G列にAAAがある場合は見つからず「検索に失敗」とメッセージが出ます。 また、 別のシートでも全く同じコードを使っているのですが、こちらは正常に動作します。 上に挙げたコードと違うところは検索範囲がE~I列だというだけです。 上記コードでとあるシートにおいてのみE~G列にある値が検索に引っかからない理由として、 どのようなことが考えられるでしょうか。 保護はかかっていません。 値が微妙に違うということもありません。 大文字小文字、半角全角の指定はしておりませんが、 C列で検索に引っかかった値をそのままG列に移動しただけで見つからなくなります。 なお、AAAに入れているデータは、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub のTarget.Addressで、「$A$20」のような形で入っています。 Sheet1のC~G列に用意している値も「$A$20」のような形で直接書き込んでいます。
- ベストアンサー
- オフィス系ソフト
- エクセルマクロ文で複数の数字で連続検索する方法
このマクロ文は、"1487"を連続検索するものですが この単体"1487"を複数の数字(たとえばRange("K"&i)み たいな?K2からK24にはランダムな数が入力されていると して)で連続検索するというふうにできないものでしょ うか? Set out = Range("A2:J111").Find("1487") If Not out Is Nothing Then igo = out.Address End If Do While Not out Is Nothing out.Font.Color = 255 Set out = Range("A2:J111").FindNext(out) If igo = out.Address Then Exit Do End If Loop End Sub
- ベストアンサー
- Visual Basic
- エクセル:Targetが複数の時の処理
Private Sub Worksheet_Change(ByVal Target As Range) Dim eiji As String eiji = Target.Address eiji = Left(Target.Address, 2) eiji = Right(eiji, 1) If eiji = "B" Then If Target.Text = "" Then Range("A1").Value = "B-clear" End If End If If eiji = "C" Then If Target.Text = "" Then Range("D1").Value = "C-clear" End If End If End Sub 上記は、C、B列の値がDeleteキーなどで空欄になった場合に文字を出力するコードです。 最初にTarget.Addressから英字部だけを抜き出し(少々ムリヤリですが)、 それを判断基準に以降の処理をしています。 この時B1:C1のように範囲選択してDeleteキーを押された場合に、 どちらの処理(今回の例だと"B-clear"と"C-clear"の表示)も行いたいのですが、 その場合どのように記述したらよいでしょうか。
- ベストアンサー
- オフィス系ソフト
- エクセル VBA:複数のシートを1つに集約
以前どこからか以下のようなVBAを見つけ使用していました。 今になり実情に合ったものに改良したいと思い始めたのですが、コピーをとる時のプロパティ UsedRangeが理解できません。 実はデータは少し不完全な場合があり、A列が他の列に比べ不足しております。 解説書などではUsedRangeを使えば、データの一番外枠、つまり全てのデータを含むようにコピーされると理解したのですが、違うのでしょうか。 データはこんな感じです。 A、B XXX、BBB XXX、BBB 、BBB よろしくお願いします。 Sub Sample() Dim sWS As Worksheet 'データシート(コピー元) Dim dWS As Worksheet '集約用シート(コピー先) Set dWS = Worksheets("AllData") '集約用シートの2行目以降を削除 dWS.UsedRange.Offset(1, 0).Clear '各シートの2行目以降のデータを、集約用シートの末尾にコピー For Each sWS In Worksheets If sWS.Name <> dWS.Name Then With sWS.UsedRange 'コピー元シートにデータが1件以上ある場合 If .Rows.Count > 1 Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=dWS.Cells(Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If End With End If Next sWS End Sub
- ベストアンサー
- Visual Basic
- VBAでセルの色付を別の列にも追加するには
WINDOWS XP EXCELL 2003です。 いつもお世話になります。 現在下記の如く、 A列にマクロを設定しています。 ※A F列には下記の数式が入っています。 A2 =IF(B2="","",TEXT(B2,"mm")) F2 =IF(G2="","",TEXT(G2,"mm")) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 2 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then Target.Offset(0, -1).Value = Date End If Dim c As Integer If Target.Column <> 2 Then Exit Sub If Target.Value = "" Then c = 0 Else On Error GoTo line Select Case Month(Target.Value) Case 1: c = 46 Case 2: c = 4 Case 3: c = 39 Case 4: c = 6 Case 5: c = 7 Case 6: c = 8 Case 7: c = 43 Case 8: c = 3 Case 9: c = 44 Case 10: c = 24 Case 11: c = 40 Case 12: c = 17 End Select End If Target.Offset(0, -1).Interior.ColorIndex = c Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0) Exit Sub line: Target.Offset(0, -1).Interior.ColorIndex = 0 Target.Offset(0, -1).Font.ColorIndex = 0 End Sub 上記のマクロに追加でF列にも同様にセルの色付けするにはどうすればいいか ご教授を御願いできないでしょうか。
- ベストアンサー
- その他MS Office製品
- VBAで別の列のセルにも色付け~2
WINDOWS XP EXCELL 2003です。 いつもお世話になります。 ご迷惑とは重々と承知しながら再度質問させていただきます。 1 御指導を賜りたいのは、 現在A列には月度を示す 01~12 が入力され月別にセルの背景色を塗りつぶしていますがこれをA列用のマクロを工夫してF列にも同様に適用したい。 例えば参照図で言うと A7 05 ピンク A8 05 ピンク A9 06 ライトブルー A10 07 草色 等のように ※ 参照図のF列のセルには背景色は適用していません。 2 参照図のそれぞれの設定は、 ※ 計画 と 生産はセル位置だけの違いで生産の方は割愛します。 D1 ユーザー定義 mm/dd D2 ユーザー定義 200000 D3 数値 A7 ユーザー定義 mm マクロ ボタン「計画入力」 Sub 計画入力() Dim GYOU '追加 GYOU = Range("C65536").End(xlUp).Row + 1 Cells(GYOU, 2).Value = Range("D1").Value Cells(GYOU, 3).Value = Range("D2").Value Cells(GYOU, 4).Value = Range("D3").Value End Sub ボタン「セルセット」 Sub 計画セル() Range("D1,D2,D3,D1").Select End Sub A列のセル塗りつぶし Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 8 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then Target.Offset(0, 0).Value = Date End If Dim c As Integer If Target.Column <> 2 Then Exit Sub If Target.Value = "" Then c = 0 Else On Error GoTo line Select Case Month(Target.Value) Case 1: c = 46 Case 2: c = 4 Case 3: c = 39 Case 4: c = 6 Case 5: c = 7 Case 6: c = 8 Case 7: c = 43 Case 8: c = 3 Case 9: c = 44 Case 10: c = 24 Case 11: c = 40 Case 12: c = 17 End Select End If Target.Offset(0, -1).Interior.ColorIndex = c Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0) Exit Sub line: Target.Offset(0, -1).Interior.ColorIndex = 0 Target.Offset(0, -1).Font.ColorIndex = 0 End Sub 御指導よろしく御願いします。
- ベストアンサー
- その他MS Office製品
- エクセルVBAの連続検索
エクセルVBAで、textbox内に入力した参加者の名前を検索しチェックを入れる作業を行いたいです(集会の受付名簿用)。findnextを使っても無限にループするか、同姓の最初の一人しか検索できずに困っています。 Dim 検索セル As Range Dim 最初のセル As String Dim 次の候補 As Range 検索対象文字 = Range("h2").Value Set 検索セル = Range("a5:B100").Find(検索対象文字) If Not 検索セル Is Nothing Then 最初のセル = 検索セル.address Do 検索セル.Select Set 次の候補 = Range("a5:b100").FindNext(after:=検索セル) Loop Until 次の候補.address = 最初のセル End If 手直しをお願いしますTT
- 締切済み
- Visual Basic
- EXCEL 2つの特定の文字列がある行を残して削除
EXCELにて2つの特定の文字列が含まれる行を残して削除したいと思っております。 A列50行にそれぞれ"年賀状""喪中""名刺"がランダムに羅列されていて、その中から"年賀状"と"喪中"の行だけを残して"名刺"の行は削除したいと思ってます。(B列以降は注文番号、枚数、氏名等が入力されています) 以下のコードで1つだけは可能でしたが、色々試しても2つはできませんでした。(コードは拾い物を少しアレンジ) Sub MacroTest1() Dim keyWord As Variant Dim FirstAdd As String Dim UR As Range Dim c As Range Const col As Long = 1 '列数 keyWord = "年賀状" If VarType(keyWord) = vbBoolean Or Len(keyWord) = 0 Then Exit Sub With ActiveSheet With .UsedRange Set c = .Find( _ What:="*" & keyWord & "*", _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows) If Not c Is Nothing Then FirstAdd = c.Address Set UR = c Do Set c = .FindNext(c) Set UR = Union(UR, c) If c.Address = FirstAdd Then Exit Do Loop Until c Is Nothing End If End With If Not UR Is Nothing Then UR.EntireRow.Hidden = True .UsedRange.SpecialCells(xlCellTypeVisible).Delete .UsedRange.EntireRow.Hidden = False End If End With End Sub どうか宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- VBA エクセル 列の並び替え
左から右にA、B、Cと値が入っています。 ABC以外の文字が列に入っていたら、削除するというマクロを組みましたが、範囲を設定するところでエラーが出てしまいました。 なぜでしょうか? 教えて下さい。 Sub arrange() Dim rg As Range Dim i As Long i = 1 Do rg = Cells(i, 1) If rg <> "A" And rg <> "B" And rg <> "C" Then Range(i & ":" & i).Delete End If i = i + 1 Loop Until (i & "1") = "" End Sub
- ベストアンサー
- オフィス系ソフト
- VB 特定の文字列が入っている行を削除したい
職場で、データの照合をしているのですが、毎回かわるキーワードが入っている 文字列が含まれる行を削除したいと考えています。 下のものは、ネットサーフィンで拾ってきたものです。 こちらでは、「文字列が含まれている行以外のものを残す」もので、 私が目的としているものと逆になっています。 アプリケーションボックスを利用して、「特定の文字列が含まれている行を削除」 できるのが理想です。 下のものを利用して(作成された方、ごめんなさい)、なんとかできるようにしたいと考えています。 どなたか助けてただけないでしょうか? 当方は、まったくの素人です。 Sub MacroTest1() Dim keyWord As Variant Dim FirstAdd As String Dim UR As Range Dim c As Range Const col As Long = 1 '列数 keyWord = Application.InputBox("除外対象の文字列は?", Type:=2) If VarType(keyWord) = vbBoolean Or Len(keyWord) = 0 Then Exit Sub With ActiveSheet With .UsedRange Set c = .Find( _ What:="*" & keyWord & "*", _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows) If Not c Is Nothing Then FirstAdd = c.Address Set UR = c Do Set c = .FindNext(c) Set UR = Union(UR, c) If c.Address = FirstAdd Then Exit Do Loop Until c Is Nothing End If End With If Not UR Is Nothing Then UR.EntireRow.Hidden = True .UsedRange.SpecialCells(xlCellTypeVisible).Delete .UsedRange.EntireRow.Hidden = False End If End With End Sub
- ベストアンサー
- オフィス系ソフト
補足
>具体的にどこ列範囲を対象にしたいのでしょう。 F列、次にO列、X列・・・と続きます。検索は4行目からになります。列でいくとF4から始まりF23で終わり、再びF30:F49、F56:F75と続きますが列全体で指定しても問題ないです。 F列で考えると、AAA・BBBを探してF列、G列をコピーしたものは上1右4にあたるJ列、K列に貼り付けるようになります。 列、次にO列、X列・・・を対象で離れてた列なので、「連続する」のが縦に繋がってる場合限定で横に並ぶ事はありません。 今書いていて思ったのがF4にもしあった場合も、処理をストップさせる必要がありました。 言葉足らずで、いつも色々な想定をさせてしまってすいません。なかなか自分目線で想定不足です。 ご迷惑をおかけします。 すいません、以下の所の指定がわかりませんでした。F列、O列、X列を指定するにはどうすればよろしいでしょうか? with worksheets("Sheet1").range("D:F") 後は、動きは想定したもので問題なさそうでした。複数指定もまとめていただきコンパクトになりとてもありがたいです。