• ベストアンサー

エクセルVBAでのセルの扱い

If Cells(retsu(n) + 3, zentai(n)).Value + 10 < Cells(retsu(n) + 3, zentai(n) + gyou(n)).Value Then 二つのセルの大きさを比較する分を作ったのですが、オブジェクトの定義エラーと表示されます。いったいどこがだめだかさっぱりわからないのですが、皆さんの知恵を貸してください。。

  • YCPM
  • お礼率4% (1/24)

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。 > オブジェクトの定義エラーと表示されます。 Cells プロパティーの書式は、   Cells(RowIndex, ColumnIndex) ですが、行列のIndex には範囲があって、   ・RowIndex : 1~65536   ・ColumnIndex: 1~256 でなければなりません。例えば、zentai(n) + gyou(n) の計算結果で ColumnIndex を指定しているわけですが、この範囲を超えてませんか? あるいは、計算結果が 0 になってしまっているとか? 、、、RowIndex のところに retsu(n) とあるのも気になると言えば、なり ますが。行列番号の指定が逆になってないですか? 取り合えず、他の方がコメントされているように、変数の中身を出力して 確認するのが良いでしょう。 VBE でイミディエイトウインドウを表示して、下記のコードでチェックし てみて下さい。 ' イミディエイトウインドウに変数の値を表示してみる Debug.Print "RowIndex:=" & retsu(n) + 3; " ColumnIndex:=" & zentai(n) Debug.Print "RowIndex:=" & retsu(n) + 3; " ColumnIndex:=" & zentai(n) + gyou(n) If Cells(retsu(n) + 3, zentai(n)).Value + 10 < Cells(retsu(n) + 3, zentai(n) + gyou(n)).Value Then

その他の回答 (3)

  • salf
  • ベストアンサー率42% (27/64)
回答No.3

>デバックの時に値が代入されているか確認したところ各配列には値がしっかり入っています。なぜだめなんでしょうか。。 その代入されている値を具体的に教えてください。 それと、その比較しようとしているセルに入っている値を具体的に押してください。

  • salf
  • ベストアンサー率42% (27/64)
回答No.2

えっと、以下のプログラムは動きますんでIF文がおかしいわけではないと思います。 If Cells(1, 1).Value < Cells(1, 2) Then MsgBox "Cell(1,1)のほうがちっちゃい" ElseIf Cells(1, 1).Value = Cells(1, 2) Then MsgBox "Cell(1,1)とCell(1,2)は一緒" Else MsgBox "Cell(1,2)のほうがちっちゃい" End If なので、使用している変数(retsu()、zentai()、gyou())に問題があると思います。 retsu()、zentai()、gyou() の値を出力して確認してみてください。

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.1

何ともいえませんが、 retsu()、zentai()、gyou()はそれぞれ定義されていますか?

YCPM
質問者

補足

皆さん返信ありがとうございます。 デバックの時に値が代入されているか確認したところ各配列には値がしっかり入っています。なぜだめなんでしょうか。。

関連するQ&A

  • 2つのシートの比較で更新分だけを色付けしたい

    表を管理していて、前月のある日に保存した内容と 翌月のある日に保存した内容を比較して 差分を取りたいのです。 例えば、表を更新した時に行が追加されたりして レコードはひとつ追加になっているけれど 他の内容は変わってないとします。 しかし、同じ位置の同じセルの値を比較だと 追加した行以降全てのセルに色が付いてしまいます。 これを、追加された行(レコード)だけを 色付けるようにしたいのです。 >If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then > > '同じ位置のセルの値が等しくなければ、そのセルを赤で塗りつぶす。 この部分に手を加えればいいのかと思うのですが、解りません。 どのようにすればいいのか教えていただけないでしょうか? お願いいたします。 Sub シート比較()  Dim RETSU_S, RETSU_E, GYOU_S, GYOU_E As Long RETSU_S = 1 RETSU_E = 10 GYOU_S = 2 GYOU_E = 101   Dim s1, s2 As Worksheet  Set s1 = Worksheets("Sheet1")  Set s2 = Worksheets("Sheet2") Dim retsu, gyou As Long 'この変数で列と行を指定する For gyou = GYOU_S To GYOU_E For retsu = RETSU_S To RETSU_E If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then '同じ位置のセルの値が等しくなければ、そのセルを赤で塗りつぶす。 s1.Cells(gyou, retsu).Interior.ColorIndex = 3 s2.Cells(gyou, retsu).Interior.ColorIndex = 3 End If Next Next End Sub

  • EXCELのVBAでセル値の移動でエラー

    EXCEL2002のVBAでセル値の移動をVBAでやりたいのですが (1)の様に1行は出来るのですが、(2)の様に2行を移動させるとエラー (実行時エラー1004 アプリケーション定義またはオブジェクト定義のアラーです。)が出てしまいます。 (2)のマクロでどうしてエラーが出るのか分かりません。 エラーを出さずに2行目を移動させる方法を教えてください。 (1)_________________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value datachn = Range("L1").Value End If (2)_______________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value Cells(2, i + 13).Value = Cells(2, i + 12).Value ←ここでエラー i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value Cells(2, 13).Value = Range("L2").Value datachn = Range("L1").Value End If

  • Excel VBA データの入っているセルの取り出し

    Excel VBA データの入っているセルの取り出し Excel2007使用です。 大きなセル範囲の中にデータが点在している場合に、そのデータを一か所にまとめるマクロを作りたいです。セル範囲は決まっています(A1:Q100)。最終的には隣のセルの1列にまとめたいです。 以下のようなマクロを作ってみましたが、いずれも作動しませんでした(エラーメッセージも出ず) NullをEmptyに変えてみても同じでした。 (ややこしいですが、アクティブセルはSheet2、Sheet1へ貼り付けたい) (とりあえずシート内で列上部にまとめようとした) Dim myRange As Range For Each myRange In Range("A1:Q100") If myRange.Value = Null Then myRange.Delete xlShiftUp End If Next myRange End Sub (1行1列ずつの参照をループさせて「空白でない」セルを切り取り-貼り付けさせようとした) Worksheets("sheet2").Activate Dim Gyou As Integer Dim Retsu As Integer For Gyou = 1 To 100 For Retsu = 1 To 17 If Cells(Gyou, Retsu).Value = Not Null Then Cells(Gyou, Retsu).Cut Destination:=Worksheets("sheet1").Cells(5, 2) End If Next Retsu Next Gyou End Sub また、以下のマクロは、実行すると現状のままSheet1のE列以降に移るだけで、データのあるセルだけがまとまるという状態にはなりません。 Range("A1:Q100").SpecialCells(xlCellTypeVisible).Cut Destination:=Worksheets("Sheet3").Range("E1") End Sub 以下は某サイトで、まさに「空白セルを削除しデータの入ってるセルを上詰めにする」というマクロが紹介されていたので、加工してやってみましたが、「RangeクラスのDeleteメソッドが失敗しました」という実行時エラーが出てできませんでした。 Dim WS As Worksheet Dim myRng As Range Dim Lrow As Long Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row Set myRng = WS.Range("A1:A" & CStr(Lrow)) myRng.SpecialCells(xlCellTypeBlanks).Delete xlShiftUp End Sub データの入っているセルだけを取り出して一つの列にまとめたいのですが、どうしたらいいのでしょうか。

  • VBAについて

    VBA初心者です、実験でユーザーフォームにボタンを設けて押されたら次から次にセルに文字を表示していくようなプログラムを組む場合 以下のプログラムですと 2回目のボタンクリックで 実行時エラー’1004’: アプリケーション定義またはオブジェクト定義のエラーです。 と出ます。 どなたか添削をお願いでしょうか。 Private Sub CommandButton1_Click() X = Cells(1, 1) If X = "" Then n = 1 Cells(n, 1) = "最初のボタンが押されました" Else Cells(n, 1) = "次のボタンが押されました" End If n = n + 1 End Sub

  • VBAエクセル空白セル0の入力

    C列が空白となるまで、F列・・・L列の空白セルに0を代入する。 という処理を行いたく以下コードで実行をして ファイル種類をCSVにて、保存した後名前の変更で拡張子をTXTにすると データ入力された列の以降がカンマの羅列が「,,,,,,,,(改行)」の繰り返しで表示されてしまいます。 (CSV保存の後、視覚的に空白部分を行選択して削除するとなくなります。) どうすれば、このカンマが表示されなくなるでしょうか。 うまく説明できてないですが、アドバイス御願いします。 Dim i As Long i = 3 Do Until Cells(i, 3).Value = "" If Cells(i, 6).Value = "" Then Cells(i, 6).Value = "0" End If If Cells(i, 7).Value = "" Then Cells(i, 7).Value = "0" End If If Cells(i, 8).Value = "" Then Cells(i, 8).Value = "0" End If If Cells(i, 9).Value = "" Then Cells(i, 9).Value = "0" End If If Cells(i, 10).Value = "" Then Cells(i, 10).Value = "0" End If If Cells(i, 11).Value = "" Then Cells(i, 11).Value = "0" End If If Cells(i, 12).Value = "" Then Cells(i, 12).Value = "0" End If i = i + 1 Loop

  • エクセルVBAの質問です。

    エクセルVBAの質問です。 セルに特定の値が入力された場合にエラーとし、「再試行」を選択するとセルが修正出来る状態にしたいのですが、下記のコードだと実行時エラーが発生してしまいます。 if cells(10,10).value > 1 then if msgbox("err", vbCritical + vbRetryCancel,"") = vbRetry then Cells(10,10).Select Cells(10,10).Active ⇒ エラー箇所 else Cells(10,10).ClearContents Endif Endif 実行時エラー '438' オブジェクトは、このプロパティまたはメソッドをサポートしてません。 いろいろネットを検索してみましたが、よくわかりませんでした・・・。 VBAは初心者です。 かなり困ってます。 どなたか助言をお願い致します。

  • excel vba 名前付きセルが存在しないとき

    あるワークシートのセルに、"_1", "_2","_3","_10"のように名前をつけています。 "_8"が見つからなかったら、ループで番号を上げていき、"_10"にたどりつくようにしたいんですが、"_8"というセルが見つからなかった時の判定方法がわかりません。 On error ではない処理を使いたいのですが、 If Range("_8") = Empty Then では実行時エラー1004 "アプリケーション定義またはオブジェクト定義のエラーです" と出ます。 Rangeオブジェクトがemptyになるわけではないんでしょうか? よい方法があれば、教えてください。

  • 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 御指導よろしく御願いします。

  • Excel VBA セル位置が取得できません

    条件1の時、セル位置を変数(gyo1)に代入し、 条件2の時、セル位置を変数(gyo2)に代入。 その後、countif(gyo1:gyo2)として、 その数値を別のセルに表示させる。 という構文を作りたいと思っています。 しかし、adressプロパティを記述しても、「オブジェクトが必要です」とエラーが出てしまいます。 (expressionをSelectionに変えるとエラーは出ないのですが、この違いや意味ってなんでしょうか。) さらに、この構文はFor文で繰り返しているのですが、 最初にgyo1の値が「A2」となっても、次の繰り返し時、条件が一致したても、gyo1が更新されず、「A2」のままだったりします。 (イメージでは、「A10」とか、A列を下に移動していくはずです。) また、gyo1,gyo2の変数宣言は、どのようにすれば良いでしょうか。 以下、作成中のコードを記述します。 力を貸してくださいませ。よろしくお願いいたします。 row = 2 If Cells(row, 1) <> Cells(row - 1, 1) Then gyo1= Selection.Address(Cells(row, 1)) End If If Cells(row, 2) <> Cells(row - 1, 2) Then gyo2 = Selection.Address(Cells(row, 2)) End If Cells(row,5).value = countif(gyo1:gyo2)

  • EXCEL VBA 取得したセルの列の最終行

    お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが 下記でつまってしまいました。 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select Sel_Col = Selection.Column Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1 For i = Last_Row To 2 Step -1 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then A_count = A_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then B_count = B_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then C_count = C_count + 1 End If Else End If Next i まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の 中での最終行が取得されてしまいます。 この場合、Sel_Col をどのように使えばよろしいでしょうか? 次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら 日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを カウントするという造りにしたいと思っています。 実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと 出てしまいます。 Wbはset Wbとして開いたブックを定義しています。 DayはDay = Dateで今日の日付を取得しています。 独学で無茶苦茶なコードですが、 どなたか詳しい方、ご教示お願いいたします。

専門家に質問してみよう