• ベストアンサー

【Excel VBA】コードの書き方「AまたはBではなかったら…」

Excel2003を使用しています。 マクロで、「選択した範囲で、A列-C列、または、F列-H列が0じゃなかったら、その行をコピーする」という処理をしたいのですが、どのようにコードを書いたらいいでしょうか? 当初は、「A列-C列が0じゃなかったら…」と条件がひとつだけで、そのときは、下記のコード(一部記載)で問題なく処理できていたのですが、条件をもうひとつ追加したら、エラーは出ないものの、結果が反映されなくなってしまいました。 マクロ勉強中ですので、ここはこんなふうにと指摘していただけると助かります。よろしくお願いします。 「A列-C列が0じゃなかったら…」   With Sheets("Sheet1")    For m = i To k    If .Cells(m, 1) - .Cells(m, 3) <> 0 Then    .Range(.Cells(m, j), .Cells(m, l)).Copy      ↓ 「A列-C列、または、F列-H列が0じゃなかったら…」    If( .Cells(m, 1) - .Cells(m, 3) <> 0 Or .Cells(m, 6) - .Cells(m, 8) <> 0) Then ( i, j, k, l で、それぞれ、選択範囲の1行目、1列目、最終行、最終列を取得しています。)

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

  • ベストアンサー
noname#95859
noname#95859
回答No.4

こういう問題、小生も、悩まされています。 (A=0でかつB=0)以外、つまり、A,Bいづれにかに、何がしか値が入っていれば・・・ としたい時には、(A<>0 or B<>0)とするのですよね。 従って、本件の問題は、スクリプトは、正しいのではないか、使い方に問題があるのではないか、と思うのです。 > i, j, k, l で、それぞれ、選択範囲の1行目、1列目、最終行、最終列を取得しています。 ----選択範囲は、その都度、決めているようです。 >If( .Cells(m, 1) - .Cells(m, 3) <> 0 Or .Cells(m, 6) - .Cells(m, 8) <> 0) Then ----しかし、判定は、常に、A,C,F,Hの値を見ています。 (何も、入力されていないと言うのは、値が「0」と同じです。) A-Cの範囲を選んだ場合、F-Hに値(0以外)が入っていれば、A=C=0であっても、コピーされます。 唯一、コピーを実施しないのは、A=C=F=H=0(空白を含む)の時です。 もし、これが、正しい推測であれば、サジェスチョンは、選択した範囲に 即した、判定をするということです。 選択した範囲のアクティブセルの列番号は、 activecell.columnで 入手できます。また、選択した範囲の行数、列数は、Variant変数に 選択した範囲を代入することで構成されるメモリ上の配列から求めます。 ---------------------------------- Sub Test() Dim myArray As Variant 'i=選択範囲の1行目 'j=選択範囲の1列目 'k=選択範囲の最終行 'l=選択範囲の最終列 i = ActiveCell.Row '選択範囲の左上の行番号 j = ActiveCell.Column '選択範囲の左上の列番号 myArray = Selection.Value 'メモリ上に配列を持ってくる R = UBound(myArray, 1) '選択範囲の行数 C = UBound(myArray, 2) '選択範囲の列数 k = i + R - 1 l = j + C - 1 With Sheets("Sheet1") For m = i To k If l < 5 Then If (.Cells(m, 1) - .Cells(m, 3) <> 0) Then .Range(.Cells(m, j), .Cells(m, l)).Copy .Cells(m, 11) End If If j > 5 Then If (.Cells(m, 6) - .Cells(m, 8) <> 0) Then .Range(.Cells(m, j), .Cells(m, l)).Copy .Cells(m, 11) End If Next End With End Sub 選択範囲の行数、列数を知るのに、Variant変数経由でやっていますが、 もっと、簡便に知る方法があれば、そちらを使った方が良いです。 小生、止む無くこの方法でやっています。

rx-z5815
質問者

お礼

Rich53 さん、こんばんは。 回答ありがとうございます。 >本件の問題は、スクリプトは、正しいのではないか、使い方に問題があるのではないか、と思うのです。 別の方法でやってみようかと思い始めていたところでしたが、「使い方に問題」という言葉で、さらに細かく条件をつけて、試してみました。 また、教えていただいたコードもヒントになり、選択範囲に対しても、さらにIFで条件をつけることで、解決できました。行き詰っていたところでしたので、大変助かりました。 ありがとうございました!

その他の回答 (6)

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

こんばんは。Wendy02です。 うっかり、私は、見過ごしていたことで、ちょっと書かせていただきます。 If( .Cells(m, 1) - .Cells(m, 3) <> 0 Or .Cells(m, 6) - .Cells(m, 8) <> 0) Then なんとなく、違和感があって見ていたのですが、よく考えてみると、基本的なことで、コンピュータのプログラムとしては、抜け落ちがあります。 「.Cells(m, 1)」これらの数値が、何かということなのです。 ワークシート上の数値というのは、みんなDouble型なのです。おまけに、そのまま引き算してしまっているから、合わない可能性は十分にあります。このコードは、結果的には、0を求めるのに他ならないわけです。それを、単に、Double型で計算しても、実務上は、数値によっては、うまくいくほうが不思議なぐらいです。 こういう場合は、「型キャスト」というテクニックを使ってしまったほうがよいのです。 「型キャスト」とは、精度を落とすことを言います。ですから、Double 型の数値は、Long型の変数に入れたときに、精度が落ちます。それを利用します。ただし、小数点があるときは、小数点固定法や整数法で計算します。Excelのセルの場合は、一旦、時間値などは、.Textプロパティで取ってから、型の変換をしてもよいです。 Dim a As Long, b As Long, c As Long, d As Long, '厳密には、一旦、セルの値の型が、Double型であることを検査します。 a= .Cells(m, 1).Value b =.Cells(m, 3).Value c =.Cells(m, 6).Value d =.Cells(m, 8).Value If (a - b) <> 0 Or (c - d) <> 0 Then   ・   ・   

rx-z5815
質問者

お礼

Wendy02 さん、おはようございます。 何度もアドバイスをいただき、ありがとうございます。 質問に関することのみでなく、最後まで丁寧に説明してくださいますので、大変参考になります。 今回は、簡単にできるだろうと思っていたことが、意外と手こずったりして、私にとっては、いろんな意味で勉強にもなりました。 私は問題が解決しても、数日は締め切らないようにしているのですが、それが良かったようです。ありがとうございました<(_ _)>

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.6

> 選択した範囲には、A列、C列とF列、H列が同時に含まれることはなく、 > どちらか一方なので、単純に Or でつなげればいいかなと思い、コード > を書いてみたのですが、うまくいきませんでした。 選択した範囲?セル指定ではなくて、Offsetプロパティを使用した方がよくない? 選択したところから、相対位置で参照できるし・・・

rx-z5815
質問者

お礼

Dxak さん、おはようございます。 再度、アドバイスをいただき、ありがとうございます。 >選択した範囲?セル指定ではなくて、Offsetプロパティを使用した方がよくない? >選択したところから、相対位置で参照できるし・・・ 今回の場合は、あるデータに対して、何度もこのマクロを実行しながら、新たにデータを完成させます。選択する範囲はマクロを実行するたびに変えますので、その都度、範囲を指定する方法にしています。 この選択した範囲に対して、さらに細かく条件をつけることで、解決できました。 ありがとうございました<(_ _)>

noname#95859
noname#95859
回答No.5

A.No4のものです。補足です。 選択範囲の列数、行数は、下記で求めることができます。 ' http://www.geocities.co.jp/Bookend-Kenji/8629/yohaku/sample.htm 選択範囲列数 = Selection.Columns.Count 選択範囲行数 = Selection.Rows.Count こちらを、使う方がスマートです。

rx-z5815
質問者

お礼

Rich53 さん、おはようございます。 再度、アドバイスをいただき、ありがとうございます。 教えていただいたURL拝見しました。 このURLのようにサンプルが記載されていると、マクロ勉強中の私にとって、とてもわかりやすく、参考になります。 最後までご丁寧にありがとうございました<(_ _)>

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

> 「A列-C列、または、F列-H列が0じゃなかったら…」 と言うのは A列-C列が0以外または、F列-H列が0以外 の場合と A列-C列が0またはF列-H列が0の場合、以外 の場合との日本語の取り方の違いが前回の論理式の違いになってます 私は、前者の様に読めたので、問題ないと思ったのですが・・・ #2さんは、後者のように読めたみたいです Not( .Cells(m, 1) - .Cells(m, 3) = 0 Or .Cells(m, 6) - .Cells(m, 8) = 0) を変換していくと Not( .Cells(m, 1) - .Cells(m, 3) = 0) And Not(.Cells(m, 6) - .Cells(m, 8) = 0) ↓ ( .Cells(m, 1) - .Cells(m, 3) <> 0) And (.Cells(m, 6) - .Cells(m, 8) <> 0) と、この間の結果になるわけです 論理式では、主流がNot、Or、Andを使いそのまま実施するので、あまり変換をしませんが・・・論理回路では、頭で考えたNot、Or、AndをNAND、NORに置き換えて安価で高速な設計していきますので、こういう論理変換は良く出てくるのですが・・・プログラムでは、あまりしませんね で、上記の日本語の説明は実際どういうものなの?

rx-z5815
質問者

補足

Dxak さん、こんばんは。 目に留めていただき、ありがとうございます。 >A列-C列が0以外または、F列-H列が0以外 >の場合と >A列-C列が0またはF列-H列が0の場合、以外 >の場合との日本語の取り方の違いが前回の論理式の違いになってます 指摘されるまで気づきませんでしたが、私は前者の意味で、「A列-C列、または、F列-H列が0じゃなかったら…」と書いていました。 選択した範囲には、A列、C列とF列、H列が同時に含まれることはなく、どちらか一方なので、単純に Or でつなげればいいかなと思い、コードを書いてみたのですが、うまくいきませんでした。 違う方法でも検討してみようと思っているので、こうしてみたら?というものがありましたら、アドバイスいただけると助かります。

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

こんにちは。Wendy02です。 前回の私の回答は、Not で書いたので間違えたようですから、前の質問側に回答をつけておきました。ですから、そちらをみていただきたいですが、ひとつだけこちらに加えておきますと、 「A列-C列、または、F列-H列が0じゃなかったら…」 一旦、変数を置くなり、If や ElseIf で、分けても良いのではありませんか? あえて、Or, And でつなげると、論理積、論理和、排他論理和など、いくら慣れていても、よほど自信がある方ならともかく、シミュレートしないと分からなくなることがあります。

rx-z5815
質問者

お礼

Wendy02 さん、こんにちは。 こちらでも、回答いただきまして、ありがとうございます。 Or や And でつなげて、いろいろ考えていると、なんだか混乱してきます。 Wendy02 さんのおっしゃるように、違う方法で処理したほうが、解決が早いような気がしてきました。 アドバイス、ありがとうございました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

書き方自体は間違ってないように見えるのですが…。 とりあえずデバッグしてみましょう。やり方はわかりますか? VBAの画面で、If文の左の方(枠の外)をクリックするか、If文の上にカーソルがある状態でF9を押すと、そこにブレークポイントが設定されます。 その状態でマクロを実行すると、ブレークポイントで処理が中断されます。 そこで右クリックして「ウォッチ式の追加」を選び、mやSheets("Sheet1").Cells(m,1)、Sheets("Sheet1").Cells(m,3)などを追加すると、それらの値を調べることができます。(ウォッチウィンドウに表示されます) また、それらのウォッチ式を追加した状態で、F8キーを押すとステップ実行(一行ごとに実行しては止まる)できるので、マクロを実行するのにF5キーでなくF8キーで実行していくと、それらの値がどう変化するかも見れます。 とりあえず、そうやって何かおかしいところがないか調べてみてはいかがでしょうか。

rx-z5815
質問者

お礼

ham_kamo さん、こんにちは。 回答ありがとうございます。 デバッグしてみました。 恥ずかしながら初めてしたのですが、おかしいところはないように感じました。 Or でつなげると、Or 以前の条件も無視(?)されてしまって、単に選択した範囲をコピーするだけになってしまいます。(私にとっては、これが不思議でしょうがないのですが…) No.2のWendy02 さんの回答にも書いてありましたが、論理和・論理積ってムズカシイですね(>_<) Or を使わない何か別の方法でやったほうが、解決が早いような気がしてきました。。。

関連するQ&A

  • 【Excel VBA】コードの書き方『AまたはBだったら…』

    Excel2003を使用しています。 マクロで、『A列-C列が0じゃなかったら、選択範囲をコピーする』という処理をしていますが、これを『A列-C列、または、Q列-S列が0じゃなかったら…』というふうにもうひとつ条件を加えたいのですが、どのように書いたらいいのでしょうか? コード(一部)は下記のようになっていますが、これでは間違っているようです。 マクロ勉強中ですので、ここはこういうふうに…と指摘していただけると助かります。お手数ですが、よろしくお願いします。    ・    ・    ・  i = Selection(1).Row  j = Selection(1).Column  k = Selection(Selection.Count).Row  l = Selection(Selection.Count).Column  With Sheets("○月")  For m = i To k  If (.Cells(m, "A") - .Cells(m, "C") <> 0 Or .Cells(m, "Q") - .Cells(m, "S") <> 0) Then  .Range(.Cells(m, j), .Cells(m, l)).Copy    ・    ・    ・

  • EXCEL VBAのFor...Nextについて

    VBA初心者です。よく理解していませんので、質問も的を得ていないかもしれませんが、ご指導宜しくお願いいたします。  現在、For...Nextを使った表計算をしています。 A列に「す」という文字が含まれていたら、B列の「す」の行に「あ」と「い」と「え」「か」のセルの合計をだす。C列、D列・・・最終列まで計算する。 上記VBAを作成する方法を教えて下さい。 A  B  C  D  E   F  G  H  I  J  K  L 1 2    3    4   5    6    7    8    9    10    11 12 あ  1 2 3 4   5 6 7 8 9 10 11 い 10 20 30 40  50 60 70 80 90 100 110 う 20 30 40 50   60 70 80 90 100 110 120 え 40 50   60  70 80 90  10 20 120 130 30 お 50 60   70  80 90 10  20 30 130 140 40 か 60 70   80  90 10 20  30 40 140 150 50 す 私は表に1~12まで数字をインプットし下記のようなコードを考えました。 Sub 列合計() Dim i, k, l, m, n As Long j = 2 For i = 6 To 120 For k = 6 To 120 For l = 6 To 120 For m = 6 To 120 For n = 6 To 120 If Cells(i, 1) = "す" And Cells(k, 1) = "あ" And Cells(l, 1) = "い" And Cells(m, 1) = "え" And Cells(n, 1) = "か" Then Do While j <= Range("A2").End(xlToRight) Cells(i, j) = Cells(k, j) + Cells(l, j) + Cells(m, j) + Cells(n, j) j = j + 1 Loop Else: End If Next n Next m Next l Next k Next i End Sub この内容だとエラーが出てしまいます。 補足ですが、あいうえおかの順番はかわったり、間に他の行が入ったりします。 また今回はL列の間としましたが、もっと列が増え、最終列まで計算する方法を知りたいのですが、どうぞ宜しくお願い致します。 ※ofice2013です。

  • エクセル VBAコードの書き方を教えてください。

    エクセル VBAコードの書き方を教えてください。 今回は、VBAで掛け算をしたいのですが、 コードが間違っているためか実行ができません。 VBAコードのどこに不備があるか教えてください。 <条件> *最終行(H列で判断)を選択し、  I2(2行、I列)~I最終行(最終行,最終行のI列)までの  範囲を計算したい。 *たとえば、I2であれば、F2×G2×H2×0.01の値を代入したい。  I最終行であれば、F最終行×G最終行×H最終行×0.01の値 EX) 添付ファイルの場合、I2=500、I4=125、にしたい。 <参考> Sub SURYO() Dim r As Long With Sheets("Sheet1") For r = 2 Cells(r,9).value = Cells(r,6) * Cells(r,7) * Cells(r,8) Next End With End Sub よろしくお願いします。

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 同一シートにC9:M33,C9:Y25,O27:Y29といった 範囲の異なる表がある場合はセル範囲をどのように記述すれば良いでしょうか? StartCol = 4 '開始列 EndCol = 20 '終了列 BlankCount = 0 I = 16 '開始行 L = 14 '行の指定 Do While Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(L, J).Value & ActiveSheet.Cells(L + 1,J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I,J).Value = "中止" Then Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 14 tmp = "△" Case Is >= 15 tmp = "○" End Select End If Next I = I + 1 If Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) = 0 Then L = I + 1 I = I + 3 End If Loop End Sub

  • 以下のマクロは、一応簡単な文字チェックマクロなのですが・・・

    L列の5行目から文字の入っている最後の行の範囲で、 L列に『等』という文字が入っているセルで M列に『トウ』の文字が入っていない場合は、MsgBoxを出すというマクロです。 Private Sub 等_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "L").End(xlUp).Row '『i』はD列の5行目から文字の入っている最後の行をいう(行の範囲) If InStr(.Cells(i, "L"), "等") > 0 Then If InStr(.Cells(i, "M"), "トウ") = 0 And .Cells(i, "M") <> "" Then MsgBox i & "行" End If End If Next i End With End Sub これに少し付け加えて、 L列に『等』が2回出てきたら、M列は『トウ』を2回出てこないとMsgBoxを出すようにしたいのですが、どのようにすればよいでしょうか? 例えば L列7行目 柑橘類等や野菜類等 M列7行目 カンキツルイトイヤヤサイルイトウ ※ ひとつ目の『等』のヨミが『トイ』となっていますが、上記のマクロですと ヨミの最後の『トウ』に反応してスルーしてしまいます。 完璧なヨミチェックはマクロでは無理かと思いますが、このくらいはスルーしないマクロを何とかゲットしたいです。。。

  • EXCEL・VBAについておしえてください

    Excel VBAで以下のようなことをしたいです。 C列に作業日が入っています。 date(today)を条件に C列で該当するセルが あればフォントの色を変えて強調させようと考えています。 それ以外は黒字フォントのままで固定です。 単独のセルだけを対象にするとうまくいので おそらく、行全体の値を取得しなければならないと 思うのですが forをつかってuboundを使っても うまくいきません。どなたかご意見をください 以下 うまくいかないコードですが のせています。  *********************** range("A1") = date set 選択範囲 = columns(C) if 選択範囲 = range("A1") then end if

  • VBAのコードに関する質問です。

    以下のコードで実行しているのですが上手くデータ数のカウンタが上手くいきません。助言をお願いしたいです。 Range("D2").Select ActiveCell.Formula = "=0.001*C2+D1" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D" & fin), Type:=xlFillDefault Range("D2:D" & fin).Select Dim i As Long, j As Long, flg As Boolean Dim i1 As Long j = 1 For i = 2 To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then i1 = i Cells(1, 7) = i - 1 Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Exit For Else: flg = False End If Next For i = i To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then j = j + 1 Cells(j, 7) = i - i1 - 2 i1 = i Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Else: flg = False End If Next Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Cells(1, 5) = Cells(2, 4) Cells(Rows.count, 6).End(xlUp).Offset(1).Value = _ Cells(Rows.count, 4).End(xlUp).Value Cells(Rows.count, 7).End(xlUp).Offset(1).Value = 200 Range("H1").Select ActiveCell.Formula = "=(F1-E1)/G1" Range("H1").Select Selection.AutoFill Destination:=Range("H1:H16"), Type:=xlFillDefault Range("H1:H16").Select Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("F1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("G1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("H1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Dim rowStr As Long, rowEnd As Long Dim A, D, Da, H, K '演算:K=D-Da-H*A Dim cntS As Integer, cntA As Integer Dim cntD As Integer, cntH As Integer Dim r As Long, t As Long rowStr = 2 '開始行 rowEnd = Cells(Rows.count, 7).End(xlUp).Row 'G列で最終行を求める cntS = 1 '周期初期値 cntD = rowStr 'D列行数初期値 cntH = rowStr 'H列行数初期値 For r = rowStr To rowEnd cntA = rowStr For t = 1 To Cells(r, 7) '各周期の繰り返し処理 A = Cells(cntA, 1).Value D = Cells(cntD, 4).Value If t = 1 Then If r = rowStr Then Da = 0 '1周期目は0とする Else '2週期目以降は最初の値に固定 Da = Cells(cntD, 4).Value End If '周期の区切りをF列に出力 Cells(cntD, 11).Value = cntS & "周期" End If H = Cells(cntH, 8).Value K = D - Da - H * A '演算 Cells(cntD, 10).Value = K cntA = cntA + 1 'A列カウンタ更新 cntD = cntD + 1 'D列カウンタ更新 Next t cntS = cntS + 1 '周期カウンタ更新 cntH = cntH + 1 'H列カウンタ更新 Next r

  • Excel2010VBA:Find、日付形式の一致

    Excel2010VBAでワークシートのE列 (関数:=IF(AND(A2<>"",B2<>"",C2<>"",D2<>""),DATE(A2,B2,C2)+D2,"")) とマクロの変数「日時1(a)」が一致すると処理を行うプログラムを作りました。(この場合一致するのは「2011/1/2 23:01」です。) E列とマクロの変数「日時1(a)」は両方とも日付形式で、「2011/1/2 23:01」で一致するはずなのですが変数「範囲」が「Nothing」で一致しません。 ■ワークシート ------------------------------------------------------------------------- A    B C D    E 2011  1 2 23:01  =IF(AND(A2<>"",B2<>"",C2<>"",D2<>""),DATE(A2,B2,C2)+D2,"") ------------------------------------------------------------------------- ■コード ------------------------------------------------------------------------- Dim 日時1(1 To 999999) As Date, 範囲 As Range With Workbooks("ブック.xlsm").Worksheets("シート") Do Set 範囲 = .Range(Cells(2, 5), Cells(527041, 5)).Find(What:=日時1(a)) If Not 範囲 Is Nothing Then ~ End If ~ ------------------------------------------------------------------------- これを一致させるためにはどうしたらいいのでしょうか? 回答よろしくお願いします。

  • vbaで、連立方程式を解く方法について

    掃き出し法を使って解くようですが、 -1 0 0 2 0 0 0 0 0 -1 -2 0 0 0 0 -2 0 0 -1 1 0 0 2 1 0 0 0 0 0 0 0 -2 0 -1 0 0 0 0 2 0 0 1 このように、行の入れ替えが必要な場合、繰り返しを用いて行を入れ替える必要がありますよね? 下のように作ってみましたが、上手くいきません。↑の行列を正しく入れ替えるだけならできるのですが、もう一度プログラムを作動させるとエラーが出ます。 For j = l To 6 If Abs(a(j, l)) >= Abs(max) Then'0と負の値しかない場合、0が最大になってしまう u = j 'このときの行を保存 End If Next j For m = 1 To 7 brank = a(l, m) '入れ替える前の値を保存 a(l, m) = a(u, m) a(u, m) = brank Cells(l, m) = Cells(u, m) Cells(u, m) = brank Next m Next l do loopを使った方が良いと聞いたのですが、どのようにすればよいのでしょうか?

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

専門家に質問してみよう