[VBA]Like演算子における複数条件の指定

このQ&Aのポイント
  • VBAを使用して、Like演算子を使って複数条件を指定する方法について質問します。
  • 現在、一文字単位で判定されるLike演算子を使用しているため、条件に一致する文字列がある場合に他の文字列もマッチしてしまいます。
  • 可能であれば、一行で条件を指定する方法についても教えていただきたいです。
回答を見る
  • ベストアンサー

[VBA]Like演算子における複数条件の指定

こちらの識者の方々にはいつもお世話になっております。 VBAの質問です。 環境は下記になります。 OS=windows7 Pro SP1 Office=Excel2010(14.0.7128.5000) 掲題のとおり、Like演算子を使って、1列目のセルの値に"ABC"か"JJJ"か"QQQ"を含む場合2列目の値を"○"にする、などの複数条件を指定したいのですが可能でしょうか?  For i = 1 To 10000   If Cells(i, 1).Value Like "*[ABC,JJJ,QQQ]*" Then Cells(i, 2).Value = "○"  Next i []内のcharlistは一文字単位で判定されるため、上記コードですと、"BDE"がマッチされてしまうかと思います。 Orを使用すれば可能であることは理解していますが、やりたいことを厳密に言えば、上記のような場合のコードを1行(For~next分を除いて)で表記したいのです。 (逆に言えばLike演算子にこだわっているわけではありません。Instrでもなんでもかまいません) このようなことは可能でしょうか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

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

  • ベストアンサー
回答No.6

回答No.5、一部修正と補足、追記です。 ' ' === RegExp 正規表現 === Sub ReW9074325j() Dim i As Long   With CreateObject("VBScript.RegExp")     .Pattern = "ABC|JJJ|QQQ"     For i = 1 To 10000       If .Test(Cells(i, 1)) Then Cells(i, 2) = "○"     Next i   End With End Sub ' ' === === === === === 編集ミスで余計な変数宣言が残ってしまったのと、 ついいつもの癖で、今回は必要のない.Global = Trueを書いてしまったのと、 2行分、余計でしたので、トルツメです。 > >> .Pattern = "(ABC|JJJ|QQQ)" > のようにOR条件にする単語を"("~")"の内側に 実は、必ずしも、"("と")"の内側に単語を列挙しなくても、 >> .Pattern = "ABC|JJJ|QQQ" で成立しているので、こちらも簡素化したものを再掲しますが、 この括弧については、慣習として、書いてあった方が、 読む人の通りが良い、というか、無いと違和感を覚える向きもあるかも知れませんので、 括弧で括っておくことをお奨めします。(という説明があった方が良かったのでした。) 少なくとも今回のようにリテラルな文字列を指定するような場合は、私は括弧を必ず付けます。 もっとも、各単語を文字列の配列変数に取得してある場合なんかでは、   .Pattern = Join(strArray(), "|") みたいな扱いで、特に括弧で括らなくても、スッキリしていていいかなぁ、とも思います。   .Pattern = "(ABC|JJJ|QQQ)" に、単語 "VVV" "XYZ" を追加する例を一応示しておきますが、、   .Pattern = "(ABC|JJJ|QQQ|VVV|XYZ)" のようにただ列挙するだけ、です。 > (記号を含む場合は別途対応が必要ですが) 単語の中に、RegExpのパターンとして特別な意味を持つ記号文字  ?*+.|{}\[]() 等 が含まれる場合は、文字列として読込ませる為に、それぞれ、  \? \* \+ \. \| ..... 等の様に、記号文字の頭に"\"を付けてエスケープする必要があります。 https://msdn.microsoft.com/ja-jp/library/ms974570.aspx (VBAのLike 演算子にもエスケープが必要な記号文字はありますけれど、  例外なく"\"だけで一様に対処できる分、RegExpの方が単純ではあります。) /// また、既出の方法以外についても考えてみました。余談に終るかも知れない参考程度の話ですが。 とりあえず、RegExpに関してですが、 もしも、例示されたのが部分的な処理内容であって、 示された処理の前にA列のセル内容を外部の一連のテキストデータから読み込んで出力している、 なんて場合は、読み込みの段階で、RegExpを使って一連のテキストを置換処理してしまえば、 わざわざセル単位のループをせずとも一気に処理させることも出来るケースもあります。 同様に、示された処理の前にA列のセル内容を外部のテーブルを読み込んで出力している、 なんて場合は、ADODB等でSQLが使える場合もあるのかも知れません。 ループさせるしかないにしても、行数がもっと多い場合などでは、 セル範囲の値を配列変数に読込んで、メモリ上で処理して、配列変数をセル範囲に出力する、 ようなやり方で、処理を速められる場合もあるかも知れません。 条件にマッチする割合が極端に低いこと (例えば数万行のデータの中で各単語数件ずつしかマッチしないとか) が予想される場合では、Excelの検索機能(range.Find メソッド)を使った方が 案外、能率的になる場合もあるのかな、とか。 全体像として、 どのようなソースで、どのような結果を求めているか、諸々の条件、 具体的な事例に副って、今回と回答No.5の中で紹介した方法の中から選ぶことになるのかな、 (、、、私の場合は)と思いますが、そういう意味では、 候補として可能性を排除できないものだけを挙げたつもりです。 もし、実際のニーズに合いそうで興味を持たれたものがあるようでしたらば、 こちらでもあらためて検討します。 /// 以上です。永、失礼しました。

rihitomo
質問者

お礼

仰るように条件が多いので、できればOr演算子は使いたくなかったのです。 例の通り、Like演算子よりはInstr関数のほうがすっきり見えますね。 しかしやはり本命は正規表現ですか。 とっつきにくい印象があり、Like演算子でなんとかと思っていたんですが、教えていただいた内容を見る限り(本件については)簡単そうなので、チャレンジしてみます。 回答ありがとうございました!

その他の回答 (5)

回答No.5

こんにちは。お邪魔します。 直接の回答としては以下のような感じです。 ' ' === Like 演算子 === Sub ReW9074325a() Dim i As Long   For i = 1 To 10000     If Cells(i, 1) Like "*ABC*" Or Cells(i, 1) Like "*JJJ*" Or Cells(i, 1) Like "*QQQ*" Then Cells(i, 2) = "○"   Next i End Sub ' ' === === === === === > Like演算子を使って、1列目のセルの値に"ABC"か"JJJ"か"QQQ"を含む場合2列目の値を"○"にする、 > などの複数条件を指定したいのですが可能でしょうか? Like演算子では、ひとつの構文で複数の単語をOR条件でマッチングさせることは不可能ですので、 複数のLike演算子構文を Or 演算子で結ぶよりありません。 似たような記述が繰り返しになることから、多少読み難く、書き損じも増えそうですね。 例題のように「○○を含む」という条件でしたら、 InStr()関数を用いる方が有利になる場合も多いので、 広く用いられる書式として、以下のような方法もあります。 ' ' === InStr()関数 === Sub ReW9074325c() Dim tmp Dim i As Long   For i = 1 To 10000     tmp = Cells(i, 1)     If InStr(tmp, "ABC") Or InStr(tmp, "JJJ") Or InStr(tmp, "QQQ") Then Cells(i, 2) = "○"   Next i End Sub ' ' === === === === === スクリプト的には、Like演算子に比べて、 ワイルドカードを省略出来たり、構文がより平易になるなど、 多少マシにはなります。 処理速度はInStr()関数が速いです。 「○○を含む」という複数のOR条件の数が多くなると、 上に挙げたふたつの例では、対応が難しくなりますので、 正規表現(VBScript.RegExp)を使った例を以下。 ' ' === RegExp 正規表現 === Sub ReW9074325j() Dim tmp Dim i As Long   With CreateObject("VBScript.RegExp")     .Global = True     .Pattern = "(ABC|JJJ|QQQ)"     For i = 1 To 10000       If .Test(Cells(i, 1)) Then Cells(i, 2) = "○"     Next i   End With End Sub ' ' === === === === === >> .Pattern = "(ABC|JJJ|QQQ)" のようにOR条件にする単語を"("~")"の内側に "|"区切りで列挙するだけ(記号を含む場合は別途対応が必要ですが) なので、条件の追加への対応が楽です。 より複雑なパターンマッチングを得意とするのが一般に知られている正規表現ですが、 複数の単語をOR条件で含む、という程度の複雑さでも、実力を発揮してくれます。 その他、「複数の単語にOR条件で完全に一致する」("含む"ではない) というような場合なら、range.AutoFilter メソッド等のExcelフィルター機能 が重宝する場合もあります。 蛇足になりますが、 If ... Then ステートメント であれば、条件に合わない場合は、何もしません。 対して、#1-4の方々がお答えになっているIIf()関数の扱いは、 条件に合わない場合にも、Empty値を出力するように書かれています。  そもそも"○"出力先のB列は空の状態から実行するとか、  条件に合わないセル範囲の値はそのまま保持するとか、  条件に合わないセル範囲を消去する必要があるとか、(←IIf()関数) 実際のニーズは様々あるとは思いますが、 私は、ご提示のコードを元に If ... Then ステートメントでお応えしています。 もっとも、これらは応用とか運用も範疇だと思いますし、 私の記述をIIf()関数や If ... Then ... Else ... ステートメントに換えるのも容易なことですが、 違いを意識した上で使い分けてあげてくださいませ。 とりあえず、以上です。 もし何か不足や疑問があったら、補足欄にでも書いてみて下さい。

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

 OR演算子を使って良いのでしたら[ ]は使わずに済ます事が出来ます。 Sub test() Dim I As Integer For I = 1 To 8 Cells(I, 2).Value = IIf((Cells(I, 1).Value Like "*ABC*") + (Cells(I, 1).Value Like "*JJJ*") + (Cells(I, 1).Value Like "*QQQ*"), "○", "") Next I End Sub

rihitomo
質問者

お礼

やはりLike演算子を使う場合はOr演算子との組み合わせが必要ですね。 回答ありがとうございます。

回答No.3

補足: OR演算子を使われる場合 Sub test()   Dim I As Integer   Dim V As String   For I = 1 To 4     V = Cells(I, 1).Value     Cells(I, 2).Value = IIf((V Like "*[A][B][C]*") + (V Like "*[J][J][J]*") + (V Like "*[Q][Q][Q]*"), "○", "")   Next I End Sub なお、OR演算子を使われる場合には、一文に拘る必要はないと思います。こういうコードですと、多分、変数Vはメモリではなくスタックに記憶されるかも知れません。加えて、シートの参照は1回で済むので、多分、こっちの方が高速で処理されます。

回答No.2

【お詫び】見事に外していましたね。 バグ:"1AJQ1"もヒットする。 で、結局は先のアイデアでは OR演算子を使うしかないようです。 Sub test()   Dim I As Integer   For I = 1 To 4     Cells(I, 2).Value = IIf((Cells(I, 1).Value Like "*[A][B][C]*") + (Cells(I, 1).Value Like "*[J][J][J]*") + (Cells(I, 1).Value Like "*[Q][Q][Q]*"), "○", "")   Next I End Sub  なお、IIF()を使ったのはヒットしなかった場合に”〇”を空に置換するためです。 PS、EXCELのVBAを書いたこともないのに誤回答してしまって陳謝。正答が付かなき場合は再質問されてください。

rihitomo
質問者

お礼

やはりLike演算子を使う場合はOr演算子との組み合わせが必要ですね。 しかし[]の使い方は参考になりました。 ありがとうございます。

回答No.1

ExcelのVBAは扱ったことがないので外しているかもしれませんが・・・。一応、以下のコードで添付図のような結果が得られました。 Option Explicit Sub test()   Dim I As Integer   For I = 1 To 4     Cells(I, 2).Value = IIf(Cells(I, 1).Value Like "*[A,J,Q][B,J,Q][C,J,Q]*", "○", "×")   Next I End Sub

関連するQ&A

  • Instr関数とLike演算子を組み合わせを教えて

    Instr関数とLike演算子を組み合わせたものでループさせたい(VBA) Instr関数で複数のOr条件を満たすものを印刷と表示させ、Like演算子でワイルドカードであいまい検索で一致するものも印刷と表示させたいのですが上手くいきません。 本当はInstr関数とLike関数を組み合わせたいのですが調べても出てこず困っております。 どなたかお教えいただけないでしょうか? ちなみにVBA初心者です、、 Sub 印刷() Dim SHEETNAME As String Dim n As Long SHEETNAME = ActiveSheet.Name 'データ数の確認 S = Sheets(SHEETNAME).Range("c1000").End(xlUp).Row '(1)標準製品かつ第一産業かつ-の右側がJのもの と (2)標準製品かつ第二産業のもの のみ印刷(13列目は製品区分、10列目は会社名、4列目は型式名称) For n = 3 To S If InStr(Sheets(SHEETNAME).Cells(n, 13).Value, "標準製品") > 0 And Sheets(SHEETNAME).Cells(n, 10).Value = "第一産業" And _ Right(Left(Sheets(SHEETNAME).Cells(n, 4).Value, InStr(Sheets(SHEETNAME).Cells(n, 4).Value, "-") + 1), 1) = "J" Or _ InStr(Sheets(SHEETNAME).Cells(n, 13).Value, "標準製品") > 0 And InStr(Sheets(SHEETNAME).Cells(n, 10).Value, "第二産業") > 0 Then Sheets(SHEETNAME).Cells(n, 12) = "印刷" Else: Sheets(SHEETNAME).Cells(n, 12).Value = Delete End If Next '型式名称にOOPPが含まれるもののみ印刷(4列目は型式名称) For n = 3 To S Dim strValue As String Dim strPattern As String strValue = "Cells(n, 4).Value" strPattern = "*OOPP*" If strValue Like strPattern Then Sheets(SHEETNAME).Cells(n, 12) = "印刷" Else: Sheets(SHEETNAME).Cells(n, 12).Value = Delete Next End Sub

  • VBA like演算子について

    VBA like演算子について 下記コードで”パターン文字列が不正です”とエラーで止まってしまいます。 For n = 3 To 89 If n Like "[5-7]" Then GoTo Skip_Line・・・・(1) If n Like "[39-70]" Then GoTo Skip_Line・・・(2)     処理・・・・・ Skip_Line: Next n nは行数で5-7行目と39-70行目を処理せずに飛ばそうとしています。 (1)はうまくいくのですが(2)の方で”パターン文字列が不正です”とエラーで止まってしまいます。 どなたかお知恵をおかしい頂ければ幸いです。

  • エクセルVBAのIFとLikeについて

    現在下記の様なコードを作成しましたが、ヒットする時と漏れが発生する時があります。原因がいくら悩んでも不明な為、コードの記載が変なのかもしれないと投稿しました。 初心者に毛が生えた位しか知識がないので、実際のコードを記載します。 '// 入力が含まれている最終行までをFor Eachで対象にする。 For Each Rr In .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) If Cells(Rr.Row, 2).Value Like "re:*" Or _ Cells(Rr.Row, 2).Value Like "Re:*" Or _ Cells(Rr.Row, 2).Value Like "RE:*" Or _ Cells(Rr.Row, 2).Value Like "fwd:*" Or _ Cells(Rr.Row, 2).Value Like "Fwd:*" Or _ Cells(Rr.Row, 2).Value Like "FWD:*" Or _ Cells(Rr.Row, 2).Value Like "*決定*" Or _ Cells(Rr.Row, 2).Value Like "*募集*" Then ※上記のElse以外の下記内容が含まれる場合は処理を実行って意味で記載してます。 ElseIf Cells(Rr.Row, 2).Value Like "*要員*" Or _ Cells(Rr.Row, 2).Value Like "*人材*" Or _ Cells(Rr.Row, 2).Value Like "*紹介*" Or _ Cells(Rr.Row, 2).Value Like "*事業主*" Or _ Cells(Rr.Row, 2).Value Like "*技術者*" Then '// 対象アイテムの代入 Hizuke = .Cells(Rr.Row, 1) Aite = .Cells(Rr.Row, 3) kenmei = .Cells(Rr.Row, 2) どうか宜しくお願い致します。

  • [VBA] InStrRevとLikeの組合せ

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 先日、 http://okwave.jp/qa/q8321600.html で質問した内容なのですが、解決したと思ったらまだ未解決のため、再度質問いたします。 A列に住所のデータがあるのですが、形式がちょっと特殊で、 A1 千代田区千代田1-1-1-301千代田マンション1号棟 A2 千代田区千代田2-3-4 というな形になっています。(A1,A2はセル番地表示で、その文字列がセルにあるわけではありません) 並び順が、市名(区名)・町名・丁目・番地・号地・部屋番号・物件名となっています。 データの定義は、丁目・番地・号地・部屋番号については半角数字・市名(区名)・町名・物件名は数字やアルファベットを含むものであっても全角であることは担保されております。 戸建てであればいいのですが、集合住宅の場合、物件名と部屋番号が入れ替わってしまっています。 これを、できればA列には住所、B列には物件名・(全角スペース)・部屋番号とわけたいのです。   A           B 1 千代田区千代田1-1-1  千代田マンション1号棟 301 2 千代田区千代田2-3-4 という内容で、ご回答いただいた Sub SplitAddresses()   Dim i As Long, n As Integer, pos1 As Integer, pos2 As Integer, pos3 As Integer   For i = 1 To Cells(Rows.Count, "a").End(xlUp).Row     With Cells(i, "a")       For n = 0 To 9         pos1 = InStrRev(.Value, n)         If pos2 < pos1 Then pos2 = pos1       Next n       Cells(i, "b").Value = Right$(.Value, Len(.Value) - pos2)       .Value = Left$(.Value, pos2)       pos2 = 0       pos3 = InStrRev(.Value, "-")       If pos3 And Cells(i, "b").Value <> "" Then         Cells(i, "b").Value = Cells(i, "b").Value & " " & Right$(.Value, Len(.Value) - pos3)         .Value = Left$(.Value, pos3 - 1)       End If     End With   Next i   Columns("a:b").AutoFit End Sub というコードでうまくいくと思ったのですが、 千代田区千代田1-2-3-4F千代田マンション1号棟 千代田区千代田1-1-1-A千代田マンション1号棟 といったデータも存在し、For n = 0 To 9ではまかなえないことがわかりました。 (数字の部屋番号だけではなく、4FやAなど、アルファベットの部屋番号が存在するということです) 数字だけではなく、半角英数字を末尾から検査し、その文字列がある位置を割り出す必要があるのですが、InStrRev関数とLike演算子を組み合わせて、返り値をpos1に代入しようと思ったもののうまくいきません。 ひとまず、返り値の確認のため、下記のようなコードを書きましたが、 Cells(1, 2) = InStrRev(Cells(1, 1), Like "*[0-z]*") というコードは通らず、 Cells(1, 2) = InStrRev(Cells(1, 1), Cells(1, 1) Like "*[0-z]*") というコードは返り値が0になってしまいます。 上記のような場合、どのようなコードが適していますでしょうか。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • VBAでIFの複数条件がうまく動きません。

    エラー表示がなくローカルでも見れませんでした。 修正箇所が分からずにいます。 詳しい方教えてください。 何卒よろしくお願いいたします。 ※S、T列に★は入るのですがA列の条件(10000以下)やS列の条件(空白以外)を無視して★が入っています。 作業内容 '(1)A列<従業員ID>のフィルターを数字フィルターで10000以上に設定 '(2)I列<所属>のフィルターを「秋田・長野・栃木・本社」以外に設定 '(3)L列<就労状況>のフィルターを「退職」以外に設定 '(4)M列<勤務形態>のフィルターを「常勤」以外に設定 '(5)S列<資格者>のフィルターを「(空白)」に設定 '(6)J列<エントリー時の保有資格>のフィルターを「aaa・bbb・ccc・ddd」に設定 For r = Cells(Rows.Count, 1).End(xlUp).Row To 4 Step -1 If Cells(r, "A") >= 10000 And _ Not Cells(r, "I") Like "*秋田*" Or Not Cells(r, "I") Like "*長野*" Or _ Not Cells(r, "I") Like "*栃木*" Or Not Cells(r, "I") Like "*本社*" And _ Not Cells(r, "L") Like "退職" And _ Not Cells(r, "M") Like "常勤" And _ Cells(r, "S") Like "" And _ Cells(r, "J") Like "*aaa*" Or Cells(r, "J") Like "*bbb*" Or Cells(r, "J") Like "*ccc*" Or Cells(r, "J") Like "*ddd*" Then Cells(r, "S") = "★" Cells(r, "T") = "★" End If Next r End Sub

  • 複数項目が同じ値である場合いくつかの条件の下で処理方法を変えたいのですが、どうしたらよいでしょうか。

    参照は1行ずつ下に移行します。6行目の列1から列11までが表1となっており、6行目の列13から列30までが表2になっています。列の項目内容は似ていますが、表2のほうが項目数は多くなっています。要は表1の行と表2の行の指定内容が一致した場合に、条件によって処理をするということがしたいのです。 列1(A)  2   3   4...    11(K)  列13(M)  14  15  16...  30(AD) 日付 時刻 コード 委託者名 ...  日付 時刻 コード 委託者名... マクロの内容としては 条件1. 列1と25M、列2と列26、列3と列15、列7と列S19が同じ値である場合    a  列8+列22=列9+列23 である場合・・・列1~列11・列13~列30を上方向に削除    b 列8+列22>列9+列33 であり、かつ列8>列9 である場合        r=列23の値         列8-r        列13~列30のみを上方向に消去     c 列8+列22>列9+列33であり、かつ列8<列9である場合        r=列23の値        列9-r        列13~列30のみを上方向に消去    d 列8+列22<列9+列33であり、かつ列22>列23である場合        r=列8の値        列22-r        列1~列11のみを上方向に消去     e 列8+列22<列9+列33であり、かつ列22<列23である場合        r=列8の値        列9-r        列1~列23のみを上方向に消去 条件2. 条件1以外は、次の行(n)へ移行する。 エラーにはならないのですが、マクロを作動させても、画面に反応がありません。基礎的な事がまだよく分かっていないので、単純なことかもしれませんが、どうしてもわかりません(涙)。 分かる方に教えていただこうと思い投稿させていただきました。よろしくお願いします。下記に、一応自分で作ったマクロを添付しています。 Sub Open_Positions2() Dim n As Long Dim i As Long Dim r As Range With Sheets("未決済") For i = 6 To .Cells(Rows.Count, 1).End(xlUp).Row For n = 6 To .Cells(Rows.Count, 13).End(xlUp).Row If .Cells(i, 1).Value = .Cells(n, 25).Value And .Cells(i, 2).Value = .Cells(n, 26).Value And .Cells(i, 3).Value = .Cells(n, 14).Value And .Cells(i, 7).Value = .Cells(n, 19).Value Then If .Cells(i, 8).Value + .Cells(n, 22).Value = .Cells(i, 9).Value + Cells(n, 23).Value Then     .Cells(i, 1).Resize(11).Delete Shift:=xlUp .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value > .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 8).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value < .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 9).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value > .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 22).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value < .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 23).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp GoTo xyz End If Else Debug.Print "Not Found" End If Next n xyz: Next i End With End Sub

  • Excel・VBAで・・。

            A    |     B    |     C 1   あああ<>いい<>  |         | 2   あああ<>うう<>  |         | 3   えええ<>おお<>  |         |     A     |    B  |   C    |   D  | 1 あああ<>いい<> | あああ  | いい<>   | いい   | 2 あああ<>うう<> | あああ  | うう<>   | うう   | 3 えええ<>おお<> | えええ  | おお<>   | おお   | というようになるようにしたいのです。 そこで、こんな感じのコードをかきました。 i = 1 i2 = 1 Do While Cells(i, i2).Value <> "" Do While Cells(i, i2).Value <> "" Namae = Cells(i, i2).Value Point = InStr(1, Namae, "<>") Cells(i, i2 + 1).Value = Left(Namae, Point - 1) Cells(i, i2 + 2).Value = Mid(Namae, Point + 2) i = i + 1 Loop i2 = i2 + 2 Loop でもD列までいかないで、C列で止まってしまうんです。 1つ目のDo whileが原因かな?と思ってるんですが、どう直したらいいかわかりません。 よろしくお願いします。

  • Excel2007VBA「区」のところで改行したい

    ●質問の主旨 エクセルワークシートのB列にある任意の住所をD列に転記します。 転記の際に「区」のところで改行したいと思いますが、 自作のコードではその通りになりません。 どのように書き換えたら良いでしょうか? ご存知の方、ご教示願います。 ●質問の補足 1.「住所1」には必ず「区」の文字が入ります 2.Mid関数の第2引数にInStr(Cells(i, 2), "区")を 使っていますが、この引数に何を使えば良いのかが分かりません。 3.添付の画像は自作のコードを使った結果、 作成された住所で、意図通りの改行はできていません。 ●コード Sub Macro1() Dim i As Integer For i = 2 To 6 Cells(i, 4) = Left(Cells(i, 2), InStr(Cells(i, 2), "区")) _ & Chr(10) & Mid(Cells(i, 2), InStr(Cells(i, 2), "区")) Next i End Sub

  • エクセルVBAでEvaluate関数で指定子を使う

    テーブル設定された表があります。 表には数字や数式が入っているのですが、 運用しているうちに数式が増え、再計算が時間が長くてストレスになってます。 時間を短くするため、VBAを使用して数式の計算結果と同じ値を設定(“値のみ貼り付け”と同じこと)をして数式を減らそうとしています。 ただし、数式は今後も追加・変更されるため、 そのときのVBAソースコード修正の手間を最小限にしたいという事情もあります。 まずは 【ソースコード1】 For i = 1 To 10000 Cells(i, 金額列).Value = Evaluate("[@単価]*[@数量]") Next i このようなコードを書いたのですが、エラー値になってしまいます。 Evaluate関数で指定子(角かっこ)は使えないのでしょうか。 使えないなら別の方法として、 数式を設定した後で、値をもう1度代入する方法を考えてます。 【ソースコード2】 For i = 1 To 10000 Cells(i, 金額列).Formula = "[@単価]*[@数量]" Next i Range("A1:Z10000").Value = Range("A1:Z10000").Value ’計算結果だけをもう1度代入して数式を消す 他に良いやり方があったら教えてください。

  • Activeセルの最終列の値を代入し、セル最終行までコピーするには

    最終列の値の代入をここで教えていただいてできました。 J = Range("IV2").End(xlToLeft).Column For i = J to 1 Step -1 If InStr(Cells(2, i).Value, "単価") > 0 Then Cells(3, i).Value = Cells(3, J).Value End If Next i この、Cells(3, i).Value = Cells(3, J).Value を、 "単価"列の最終行までコピーするには どのような記述をしたらいいでしょうか? しばらく悩んでいますができません。。。 お力を貸してください。!

専門家に質問してみよう