• ベストアンサー

【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    ・    ・    ・

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

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

こんにちは。Wendy02です。 >教えていただいたコードで試してみましたが、やはり、結果が反映されませんでした。 If (.Cells(m, "A").Value - .Cells(m, "C").Value <> 0) Or _ (.Cells(m, "Q").Value - .Cells(m, "S").Value <> 0) Then それから後に、もう一度検証してみましたが、間違いはありません。 いくらミスの多い私でも、以下のように、変数を別途取って、これで間違えたら、どうしようもありません。 他の要因が混じっているのではありませんか? 一つは、他の場所を指しているとか? もしかしたら、最初から思っていることと違っているとか……(^^; 一旦、以下のようにして、変数で、ログを取ってみればよいと思います。 'Value プロパティは入れなくても、自動的に、Value 値になります。ただし、文字列も、数値として計算されます。 Dim a As Boolean '一応、宣言はしてください。 Dim b As Boolean Dim c As Boolean a = (.Cells(m, "A").Value - .Cells(m, "C").Value <> 0) b = (.Cells(m, "Q").Value - .Cells(m, "S").Value <> 0) c = a or b '結果:True で、「コピーする」ことになると思います。  True or False = True  False or True = True  True or True = True  False or False = False

rx-z5815
質問者

お礼

Wendy02 さん、こんばんは。 お手数かけて申し訳ありません。。。 今回は、コードの書き方には問題がなかったようなので、前にアドバイスをいただいたように、さらに細かく条件をつけることにしました。 何度も丁寧に回答してくださったおかげで、いろいろと勉強にもなりました。ありがとうございました! また、お世話になることもあるかと思いますが、よろしくお願いします。

その他の回答 (7)

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

こんばんは。 新たな回答を、#2849639 側に書きました。 ロジックとしては、最終的にここの回答でよいと思いますが、もう少し、私は、考えればよかったです。ワークシートでは「マイナスは要注意」ですが、VBAでは、小数点すべてが要注意です。つまり、浮動小数点の問題を見逃していました。

rx-z5815
質問者

お礼

Wendy02 さん、こんにちは。 こちらにも書き込みしていただき、ありがとうございます。 今回の質問の場合は、整数のみしか扱わないのですが、ワークシートでは「マイナスは要注意」、VBAでは小数点すべてが要注意とは、恥ずかしながら知りませんでした(^^ゞ こちらの質問も、すぐに締め切らなくて良かったです。 ありがとうございました!

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

こんにちは。Wendy02です。 私の回答は、Not ステートメントで書いたけれども、"<>"でしたら、 間違えましたね。 以下は、特に、VBAの場合は、カッコをつけて変わることはありませんが、見易さのために、つけてみました。 If (.Cells(m, "A").Value - .Cells(m, "C").Value <> 0) Or _ (.Cells(m, "Q").Value - .Cells(m, "S").Value <> 0) Then

rx-z5815
質問者

お礼

Wendy02 さん、こんにちは。 再度の回答ありがとうございます。 教えていただいたコードで試してみましたが、やはり、結果が反映されませんでした。論理和・論理積って、よほど慣れていないと難しいのですね。 別件でのWendy02 さんのアドバイスにもありましたように、別の方法で処理することを検討してみようと思います。 ありがとうございました。

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

申し訳ないのですが、少し、割り込みさせていただきます。 通常、私は、Selection が、Rangeと確認できている場合は、それ自身が持っているプロパテイで、以下のようにして列と行のサイズを取得します。 With Selection  i = .Cells(1).Row  j = .Cells(1).Column  k = .Cells(.Count).Row  l = .Cells(.Count).Column End With 2次元配列でも良いのですが、配列は、縦横が逆になりますので、気をつけないと間違えてしまいます。 >Cells(m,"A") なお、ここの掲示板では、こういう書き方をされる方が多いようですね。可読性が高くなるからでしょうけれども、私は、VBAでは、ワークシートに対して、数式をR1C1方式にして読み出すことも多いし、Cellsに対しても、R1C1方式のほうが読みやすく感じます。(出力自体は、A1 にしてあれば、A1方式に変わります) 文字列を数値に置き換えるタイムラグなどは、微々たるものでしょうから、それ自体は問題にはならないはずですが、内部的には、おそらく読み替えているように思います。

rx-z5815
質問者

お礼

Wendy02 さん、おはようございます。 再度アドバイスをいただき、ありがとうございます。 以前、別のVBAに関する質問で、数式をR1C1方式で書いたコードを教えていただいたのを思い出し、もう一度見てみましたが、確かにR1C1方式のほうが読みやすく感じました。 ところで、この質問に対する回答(No.2)をいただいて、お礼を出した後に、わからないことが出てきてしまい、このアドバイス(No.5)をいただく前に、No.2の補足欄にその内容を書いて、再度質問させていただいたのですが、こちらの方は、どのようにしたらいいでしょうか?お手数ですが、よろしくお願いします<(_ _)>

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

UBound 関数は、配列の使用可能な最大値を調べる関数です UBound(Selection.Value,1) の様に、第一引数に配列変数、第二引数に次元数を指定します LBound 関数と、対になってて、こちらの場合は最小値を調べます Selectionの場合、1から始まるのでUBound 関数で最大値だけ調べてるわけですが・・・

rx-z5815
質問者

お礼

再度の回答ありがとうございます。 『UBound』は、配列の使用可能な最大値を調べる関数なんですね。 またひとつ勉強になりました。 >Selectionの場合、1から始まるのでUBound 関数で最大値だけ調べてるわけですが・・・ そうですね、最大値だけ調べれば事足りるってことですね。大変参考になりました。ありがとうございました。

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

条件ではなくて、 > k = Selection(Selection.Count).Row > l = Selection(Selection.Count).Column の部分では? 「Selection.Count」は、選択されたセルの個数 例えば「B3:C9」だと、14セル(7セル×2セル) k = i + UBound(Selection.Value,1) l = j + UBound(Selection.Value,2) で、大丈夫かな? 私も、「Cells(m, "A")」とか、気になるんだけど・・・Class Rangeだから、動くのかな?

rx-z5815
質問者

お礼

Dxak さん、こんにちは。 回答ありがとうございます。 No.2の Wendy02 さんの回答で、うまくいきました。 論理和・論理積の問題だったようで、[Or]を[And]に訂正することで、解決しました。 ちなみに、  If (.Cells(m, "A") - .Cells(m, "C") <> 0 And .Cells(m, "Q") - .Cells(m, "S") <> 0) Then という書き方でも、問題なく処理されました。 あと、教えていただいた >k = i + UBound(Selection.Value,1) >l = j + UBound(Selection.Value,2) で、『UBound』を初めて目にしたのですが、これはどういうことを表しているのでしょうか?よろしければ、教えていただけると、マクロ勉強中ですので、参考になります。

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

こんにちは。Wendy02です。 >『A列-C列、または、Q列-S列が0じゃなかったら…』 たぶん、私の理解の範囲ですと、これは、「論理和・論理積」のことだと思います。 プログラムの基礎の基礎で出てきますが、恥ずかしいのですが、私も間違いそうになります。(^^;  「論理和」を、そのまま使っても反転しません。 If A Or B = True Then と論理和をそのまま、結果、True で、反転して、 If Not A Or Not B = True Then にした場合に、論理和のままですとうまくいきません。 これは、論理積にしなくてはなりません。 If Not A And Not B = True Then 一度、スモールサンプルで、その逆転を試してみると良く分かります。 '----------------------- Sub test() a = 0 b = 0 c = 1 d = 0 ' If (a - b <> 0) Or (c - d <> 0) Then  If (a - b <> 0) And (c - d <> 0) Then    MsgBox "True"  Else    MsgBox "False"  End If End Sub そういう私も、今は、別のプログラムの基礎の基礎から勉強中です。

rx-z5815
質問者

お礼

Wendy02 さん、こんにちは。 回答ありがとうございます。 ちょうど、No.1さんの回答を元にコードを変更して、マクロを実行してみたところ、結果が反映されていなかったので、また新たな疑問が出てきたところでしたが、Wendy02 さんの回答で、うまくいきました! Or より前の『A列-C列が0じゃなかったら』の部分の条件も無視(?)されて、単なる選択範囲のコピーになってしまい、困っていたところでしたので、本当に助かりました(*^^*)

rx-z5815
質問者

補足

何度もすみません。 お礼を出した後、わからないことが出てきたので、補足欄を使わせていただきます。 先程、 Or を And に訂正して、うまくいったと思っていたのですが、ちゃんと結果が反映されない場合が出てきてしまい…というか、 And に訂正したので当然のことなのかもしれませんが、単純に質問文に記載しているコードの Or を And 訂正するだけではダメだったのでしょうか? 結果が反映されなかったときの選択範囲を見てみると、A列とC列は含まず、Q列とS列を含む選択範囲なのですが、その範囲内のA列-C列が0の行がコピーされていませんでした。 また、 And を Or に戻してみたり、といろいろ試してみたのですが、どうしたらいいのかわかりません。何度も申し訳ありませんが、教えていただけないでしょうか?

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

If (.Cells(m, 1) - .Cells(m, 3) <> 0 Or .Cells(m, 17) - .Cells(m, 19) <> 0) Then × Cells(m,"A") ○ Cells(m,1)

rx-z5815
質問者

お礼

chie65536 さん、こんにちは。 回答ありがとうございます。 当初の『A列-C列が0じゃなかったら…』という条件のみのときは、  If .Cells(m, "A") - .Cells(m, "C") <> 0 Then という書き方でも、問題なかったようですが、これはどうしてなのでしょうか?もし、よろしければ、教えていただけると嬉しいです。

関連するQ&A

  • 【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列目、最終行、最終列を取得しています。)

  • Excel VBA 条件を満たすデータのコピーと計算結果の表示

    Excel2003を使用しています。 Sheet1のある選択範囲に対して(都度、手動で選択します) D列-E列が0でなかったら、その行のデータをSheet2のアクティブセル以下にコピーするという処理を下記のマクロでしています。 下記のマクロにコードを追加することによって、条件を満たすデータをコピーする際、D列-E列の計算結果をSheet2のD列に表示させることは可能でしょうか? 例えば、Sheet1のD5セルに100、E5セルに50と数値が入力されていた場合、Sheet2のD7セルに50と計算結果を表示させたいですのですが…。 (貼り付け先の行は、アクティブセルの行です) よろしくお願いします。 -------------------------------------------------- Sub Macro1()  Sheets("Sheet1").Activate '選択範囲のサイズ取得   With Selection    i = .Cells(1).Row    j = .Cells(1).Column    k = .Cells(.Count).Row    l = .Cells(.Count).Column   End With  Sheets("Sheet2").Activate   ActR = ActiveCell.Row   ActC = ActiveCell.Column  With Sheets("Sheet1")   For m = i To k    If .Cells(m, 4) - .Cells(m, 5) <> 0 Then     .Range(.Cells(m, j), .Cells(m, l)).Copy     Sheets("Sheet2").Cells(ActR, ActC).PasteSpecial Paste:=xlPasteAllExceptBorders     ActR = ActR + 1     Application.CutCopyMode = False    End If   Next  End With End Sub

  • excel VBA のコードを編集したい

    下記VBAのコードですが、「選択範囲をCSVファイルにしてカレントフォルダに出力する」というものですが これを編集して、どのパソコンでもデスクトップに出力すると編集したいです。 どのようにコードを変更したらいいか、教えていただけないでしょうか?自分ではどうがんばっても変更できそうにありませんでした。 どうかよろしくお願いいたします。 Sub Selection_CSV_Output() 'ファイル名をINPUTBOXで取得 '選択範囲を調べる '選択範囲の左上から1列づつ最終列までセルの値を取得しカンマを付加した文字列を作成 '1行分の文字列の最後カンマを削除し、改行コードを付加する '行数分だけ繰り返す 'CSVファイルとして、出力 '確認メッセージをMSGBOXで表示 'テストバージョン Dim myInBox As String Dim start_row, start_column, end_row, rows_count, columns_count, end_column As Long Dim SaveD, d As String Dim CsvF_name, cellD As String Dim i, j As Long 'InputBoxでファイル名指定 myInBox = Application.InputBox(Title:="ファイル名", prompt:="拡張子なしのファイル名を入力してください", Default:="001", Left:=100, Top:=100, Type:=2) If myInBox = "False" Then Exit Sub 'Debug.Print myInBox 'ファイル名 CsvF_name = myInBox & ".csv" '範囲を調べる start_row = Selection.Row '開始行 start_column = Selection.Column '開始列 end_row = start_row + Selection.Rows.Count - 1 '終了行 end_column = start_column + Selection.Columns.Count - 1 '終了列 rows_count = Selection.Rows.Count '範囲行数 columns_count = Selection.Columns.Count '範囲列数 '読み込みと出力 Open CsvF_name For Output As #1 For i = start_row To start_row + Selection.Rows.Count - 1 '行の繰り返し For j = start_column To end_column '列の繰り返し cellD = Cells(i, j).Value SaveD = SaveD & cellD & "," 'カンマを付加 Next j '列の終わり SaveD = Left(SaveD, Len(SaveD) - 1) '最後の一文字(カンマ)を消す SaveD = SaveD & vbCrLf '改行コードを付加 'Debug.Print SaveD Next i 'Debug.Print SaveD Print #1, SaveD Close #1 '確認メッセージ MsgBox CsvF_name & "名でカレントフォルダに作成しました。" End Sub

  • 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

  • 【Excel VBA】日付の代入

    現在以下の操作を行いたく、コードを作成しています。 ・20~23行で各最大値を抽出し、C列に代入する ・最大値に紐づく日付をD列に代入する ・D列の日付が入ったセルを改行し、 2行目に"(曜日)"を入力する <現在のExcelデータ詳細> A20:"処理1" A21:"処理2" A22:"処理3" A23:"処理4" B19~AF19:日付 B20~AF23:任意の数字 C31:処理1の最大値 C33:処理2の最大値 C35:処理3の最大値 C37:処理4の最大値 D31、D33、D35、D37:日付 L(曜日)を入力予定 最大値に紐づく日付をD列に代入するところで 躓いています。 ご教示いただけないでしょうか。 現在のコードは下記の通りです。 Sub 最大値の取得() Dim max As Long Dim row As Integer Dim column As Integer For row = 20 To 23 max = 0 For column = 2 To 32 If Cells(row, column).Value > max Then max = Cells(row, column).Value End If Next Cells((row - 20) * 2 + 31, 3).Value = max For i = 4 To 1 Step -4 '編集中 Cells((row - 20) * 2 + 31, 4).Value = Cells(row - i, column - 1) '編集中 Next End Sub

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • 複数の列を繋げてA列に入れたい VBA

    aaa aaa  bbb aaa  bbb  ccc aaa (A列にaaa、B列にbbb、C列にcccが入ってます) と言うデータがあるのですが 全てA列に入れて aaa aaabbb aaabbbccc aaa としたいです。 ・最終列は必ずしもCではないのです。(Dの場合もEの場合もある) ・最終行も変化します。 Sub 分かれてる列を繋げる() Dim Col As Long Dim Row As Long For Row = 1 To Range("a65536").End(xlUp).Row   For Col = 1 To Cells(Row, 256).End(xlToLeft).Column    Cells(Row, 1) = Cells(Row, 1) & Cells(Row, 2) & Cells(Row, 3)    Next Col Next Row End Sub をやってみましたが、 aaa aaabbbbbb aaabbbcccbbbcccbbbccc aaa となってしまい、 欲しい結果とは違くなってしまいます。

  • 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を入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • Excel VBA オートフィルの範囲指定

    Excel VBA で関数を入れたセルを最下行までコピー させたいのですが、範囲の指定がうまくできません。ごちゃごちゃ書きすぎて、よくわからなくなってしまいました。 実行してみたら、オートフィルのところでデバッグが出ました。 VBAはまだまだ初心者レベルです・・・ どこをどう直せばきちんと処理されるのか、どなたかお知恵をお貸しください。 (それと初めの定義は、Rangeで合ってるのでしょうか?) Sub sample() Dim MyCell1 As Range Dim MyCell2 As Range Dim MyCell3 As Range Dim MyCell4 As Range Dim MyCell5 As Range Set MyCell1 = Cells(5, Range("4:4").Find(what:="○○", searchorder:=xlByColumns).Offset(1, 1).Column) Set MyCell2 = Cells(5, MyCell1.Offset(0, 2).Column) MyCell1.Select Selection.Formula = "=$A5-" & MyCell2.Address(False, True) Set MyCell3 = Cells(5, MyCell1.Offset(0, -1).Column) Set MyCell4 = Cells(5, Cells(5, Columns.Count).End(xlToLeft).Column) Set MyCell5 = MyCell1.Offset(0, 1) MyCell5.Select Selection.Formula = "=" & MyCell3.Address(False, True) & "-" & MyCell4.Address(False, True) Range(MyCell1, Cells(5, MyCell1.Offset(0, 1).Column)).Select Selection.AutoFill Destination:=Cells(Cells(5, MyCell1.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, MyCell5.Column)), Type:=xlFillCopy End Sub ********************* 下のような表に関数を入力して最下行までコピーさせたいです。  | A | B | C | D | E | F | G | H | I | J | K | L | -------------------------------------------------------------------------- 4 | code | name | 7/1 | 7/2 | ○○ |    |    | code|name| 7/1 | 7/2| ○○ | 5 |10000|aaaaaa| 15  | 20 | 35  |     |    |10001|bbbbbb| 13 | 25 | 38 |                           ((                            )) F5に "=$A5-$H5" と数式を入れてcodeを比較し、G5に "=$E5-$I5"と入れて数量を比較する。 F列とG列の入力されている最下行まで数式をコピーする。 ※毎月日数が変わり、商品数も変わるので、A列・B列・4行目以外は全て可変。 WindowsXP Excel2003 です。 よろしくお願いいたします。

専門家に質問してみよう