• ベストアンサー

VBAにて実行時エラー’1004’:「アプリケーション定義又はオブジェクト定義のエラー」発生?

VBA初心者です。Xp,Excel2000を使用しています。 シフト者のカレンダー作成しており、動作していたVBAのコピーを利用しています。 何回かループを回った後表記エラーとなります。アドバイスをお願いいたします。   A B C D E -------------------------- 1 2 3 4 ...... <-- 日付 2 2 0 1 ...... <-- シフト(ln_1の範囲名) 7 8 9 10 ...... <-- 日付 1 0 3 3 ..... <-- シフト(ln_2の範囲名) .................... For i = 1 To 6   <-- 最大6週にわたる Set r = Range("ln_" & LTrim$(Str$(i))) cpos = r.Column rpos = r.Row For n = 1 To r.Columns.Count With Cells(rpos - 1, cpos + n - 1) m = .Characters.Count <-- 数回ループ後ここでエラーとなる! s = Cells(rpos, cpos + n - 1) <-- シフト情報 Select Case s Case ""    '- Blank - ........ 日付セルの装飾 Case "0" '- Holiday - ......... 日付セルの装飾 Case "1" '- shift1 - ........... 日付セルの装飾

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

  • ベストアンサー
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.5

よく調べてみたら、Characters.Countは、"ABC"などの文字列では3を返しますが、"123"ではエラーになり、数字ではだめなようです。セルの書式を文字列にしてもだめでした。 m = .Characters.Count は文字の数をお知りになりたいだけのようなので、以下のコードに換えて試してみてください。 m=Len(.value) なお、MsgBox .Address などは、エラーのでるコードの前に挿入、という意味で書きました。 泥臭い方法ですが、コードがどのセルを参照しているのかわかるので、エラーがでる時などにはおすすめです。

yachin
質問者

お礼

再びありがとうございます! あなたの言われる通りです。これで疑問が氷解いたしました。Helpファイルの説明だけでは、読みきれませんでした。(ん...修行が足りぬ。)長くお付き合いさせてしまって、ごめんなさい。sakenomoさん、お礼に本当に一緒に「酒飲み(sakenomo)」たい気分です。 今後も、宜しくお願いします!!

その他の回答 (5)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

再びこんにちは。 > *Cells()はObjectとですので、Cellの頭の点はお間違いですね?) > ループの外で With Worksheets("XXXX")でシート明示しました えっと、当方Excel97なんですが、Excel97ではCellsはプロパティです。 この場合、特定のWorksheetオブジェクトのセルに対しての操作なので、 .Cells にしないとWithの意味が無いと思います。 Excel2000以降では違うのかな? 原因は別の所だったようですが、、、

yachin
質問者

お礼

ありがとうございました!No.3の回答で解決できました。 今後も宜しくお願いいたしますpapayukaさん!

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.4

エラーがでるコードの前に、 MsgBox .Value とか、 MsgBox .Address  などを置いて様子をみてはいかがでしょう。 In_*の名前が付けられたセル範囲の列と、 日付セルの列が合っていない部分がある ような気がしますが…。

yachin
質問者

お礼

ありがとうございます。 ご教授の件は Debug.Print .Address, .Value でしょうか? Debugの中にも色々知らない便利な機能があるんですね!… ご指摘の定義名の列と日付セルの列は、合っていました。

yachin
質問者

補足

ご教授の件を試行錯誤している時、日付セルを修正入力(F2+Enter)あるいは新規に入力(TAB or ENTER)すると、 エラーを起こす場所(セル)が入力した次のセルに移動します。 コードでセルデータを、自身のデータで上書きしてもNGです。 全ての日付データを入力しなおしたら、最後までループが回りました!! 一体どう言う事なんでしょう? *後学のため、どなたか考えられる要因と対処方法をお教え願えないでしょうか?

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 問題の Select Case部分が解らないのですが、、、 With Worksheets("Sheet1") m = .Cells(rpos - 1, cpos + n - 1).Characters.Count s = .Cells(rpos, cpos + n - 1) のように、シートを明示した場合はどうでしょう?

yachin
質問者

お礼

ありがとうございます。Withってネストできますよね? (1)ループの外で With Worksheets("XXXX")でシート明示しました....NGでした。(WIthのネスト) (2)ご指摘の場所でシート明示し、日付セル( Cells(rpos - 1, cpos + n - 1))のコントロール、プロパティ部分はWithを用いず全てコーディングしました。....NGでした。 (*Cells()はObjectとですので、Cellの頭の点はお間違いですね?) *何が原因なのでしょうか?この2,3日悩んでおります!

  • wildcard
  • ベストアンサー率54% (54/100)
回答No.2

たぶん外していると思いますが… End With が無いためとか?

yachin
質問者

お礼

ありがとうございます! No.1でも補足しましたように、基本部分は変更しておりませんので....

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

たぶん、セルのどこかに、Null(空白)があると思います。0とか空白を埋めて試してください。

yachin
質問者

補足

早速の回答有難うございます!元のVBAの基本部分は変更せず、セルの装飾部分だけの変更です。このデータで元のVBAで動作し、正常に動作している事を確認しております。そこから変更部分をコーディングしておりますので、データ(セル)に御指摘の不具合があるとはおもわれません。 >たぶん、セルのどこかに、Null(空白)があると思います。0とか空白を埋めて試してください。

関連するQ&A

  • VBA 実行時エラー1004 について

    いつもお世話になります。 作表をしていて、項目に色をつけたいのですが VBA 実行時エラー1004 Rangeメソッドは失敗しました。Globalオブジェクト というエラーが If Range(Cells(5, n - 4)).Interior.Color = RGB(252, 213, 180) Then のところででます。 If Range("Z5").Interior.Color = RGB(252, 213, 180) Then とすると、実行できます。 Sub カラー() Dim n As Long '列番号取得 '最終列取得 n = Cells(5, Columns.Count).End(xlToLeft).Column MsgBox "最終列は" & n   '= 今回は30です。 'セルの色を変える If Range(Cells(5, n - 4)).Interior.Color = RGB(252, 213, 180) Then Range(Cells(3, n - 3), Cells(5, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(39, n - 3), Cells(41, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(68, n - 3), Cells(70, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(104, n - 3), Cells(106, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(133, n - 3), Cells(135, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(169, n - 3), Cells(171, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(198, n - 3), Cells(200, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(234, n - 3), Cells(236, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(263, n - 3), Cells(265, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(299, n - 3), Cells(301, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(329, n - 3), Cells(331, n)).Interior.Color = RGB(230, 184, 183) Range(Cells(365, n - 3), Cells(367, n)).Interior.Color = RGB(230, 184, 183) Else Range(Cells(3, n - 3), Cells(5, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(39, n - 3), Cells(41, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(68, n - 3), Cells(70, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(104, n - 3), Cells(106, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(133, n - 3), Cells(135, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(169, n - 3), Cells(171, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(198, n - 3), Cells(200, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(234, n - 3), Cells(236, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(263, n - 3), Cells(265, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(299, n - 3), Cells(301, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(329, n - 3), Cells(331, n)).Interior.Color = RGB(252, 213, 180) Range(Cells(365, n - 3), Cells(367, n)).Interior.Color = RGB(252, 213, 180) End If End Sub どこが間違っているのか教えていただけないでしょうか? あと、スマートなコードの書き方もお願いします。

  • VBA アプリケーション定義またはオブジェクト定義のエラーです

    VBA初心者です。 仕事中、暇な時にVBAの勉強をしています。 あるファイルのフォーマットを指定されたフォーマットに変換するプログラムを作成しています。 実行後、「アプリケーション定義またはオブジェクト定義のエラーです」と出て、先に進めません。 どなたが分かる方、ご教授お願い致します。 以下ソース Private Sub CommandButton1_Click() ' 変数定義 Dim openFileName As String Dim priorYearBudget As String, thisYearBudget As String, increaseAnddecrease As String Dim bigSection As String, mediumSection As String, smallSection As String Dim fileLastRow As Long, buf As Long, index As Long Dim head As String ' 初期化 index = 2 ' ファイル名取得 openFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If openFileName <> "False" Then ' ファイルが存在したらファイルを開く Workbooks.Open openFileName ' 項目を変数に格納 ' bigSection = Sheets(1).Cells(1, 3) ' mediumSection = Sheets(1).Cells(1, 4) ' smallSection = Sheets(1).Cells(1, 5) priorYearBudget = Sheets(1).Cells(1, 6) thisYearBudget = Sheets(1).Cells(1, 7) increaseAnddecrease = Sheets(1).Cells(1, 8) ' ファイルの最終行を取得(データが格納されている行) fileLastRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row ' ワークシートの追加 Worksheets.Add after:=Worksheets("Sheet1") ' セルの幅指定 Columns("A").Select Selection.ColumnWidth = 70 Columns("B:D").Select Selection.ColumnWidth = 13 Columns("A").Select ' 幅設定で選択されたセルを解除 range("A1").Select ' 新規に追加されたワークシートに項目を設定 Sheets(2).Cells(1, 1).Value = "勘定科目" Sheets(2).Cells(1, 2).Value = priorYearBudget Sheets(2).Cells(1, 3).Value = thisYearBudget Sheets(2).Cells(1, 4).Value = increaseAnddecrease ' 元ファイルの見出しの形式を変更 For headCnt = 1 To fileLastRow head = Sheets(1).Cells(headCnt, 1) bigSection = Sheets(1).Cells(index, 3) midiumSection = Sheets(1).Cells(index, 4) smallSection = Sheets(1).Cells(index, 5) If head <> "" Then ' 項目設定 Sheets(2).Cells(headCnt, 1).Value = "【" & head & "】" End If If bigSection <> "" Then ' 大区分設定 Sheets(2).Cells(buf, 1).Value = bigSection←ここでエラー発生 ElseIf midiumSection <> "" Then ' 中区分設定 Sheets(2).Cells(buf, 1).Value = midiumSection ElseIf smallSection <> "" Then ' 小区分設定 Sheets(2).Cells(buf, 1).Value = smaillsection End If ' Sheets(2).Cells(cnt, 1).Value = head ' head = Sheets(1).Cells(cnt, 1) index = index + 1 buf = buf + 1 Next headCnt ' 元ファイルの金額をそのままコピー For budgetCnt = 2 To fileLastRow Sheets(2).Cells(budgetCnt, 2).Value = Sheets(1).Cells(budgetCnt, 6) Sheets(2).Cells(budgetCnt, 3).Value = Sheets(1).Cells(budgetCnt, 7) Sheets(2).Cells(budgetCnt, 4).Value = Sheets(1).Cells(budgetCnt, 8) Next budgetCnt Else MsgBox "キャンセルされました" Exit Sub End If End Sub 補足 エラーが発生する箇所をコメントアウトすると、正常に動作します。 よろしくお願い致します。

  • VBA オブジェクト定義エラー

    VBA初心者です。 アプリケーション定義エラーまたはオブジェクト定義エラーが出ました。 原因を教えてください。 A=2800 B=3300 委託料=AとBの合計の5% Cell(5,j)のセルにAとBの合計の5%の数値"305"を入力したいです。 Sub syouhinbubetu() Dim Sheetobj As Worksheet Dim A As Integer Dim B As Integer Dim 委託料 As Integer Set Sheetobj = ThisWorkbook.Worksheets("Sheet1") With Sheetobj A = .Cells(3, j) B = .Cells(4, j) 委託料 = .Cells(5, j) For j = 3 To 6 .Cells(5, j) = (A + B) * 0.05 Next j End With End Sub 定義は、きちんと整数の定義にしているはずなのですが、どうしてでしょうか? それから、もう一つ教えてください。 C/Dの値をセルに入れるのは次の式でよいと思いますが、 .Cells(7,j)=C/D その数値が少数になる場合四捨五入をした値(小数点以下すべて切り捨て)を入れる場合はどのような式になりますか? 初心者過ぎて申し訳ありません。 VBAの基本の本で勉強したのですが、それを応用して実践する場合にどのようなプログラムになるのかが分かりません。 良い本があれば紹介していただけないでしょうか。 私が勉強した本は、「世界で一番簡単なExcel VBAのe本」です。 分かりやすい応用編の本があれば教えてください。 たくさんの質問で申し訳ありませんが、よろしくお願いいたします。

  • VBAでシート名の定義を変更したいのですが

    VBAである規則性があるコードがあるのですがうまく出来ません。どなたかお願いします。 Worksheet("test" & TY).Cells(15, 6).name ="DD" & TY & "0101" Worksheet("test" & TY).Cells(16, 6).name ="DD" & TY & "0102" Worksheet("test" & TY).Cells(17, 6).name ="DD" & TY & "0103" Worksheet("test" & TY).Cells(18, 6).name ="DD" & TY & "0104" Worksheet("test" & TY).Cells(19, 6).name ="DD" & TY & "0105" ・ ・ ・ ・ ・ かなり似通っているのでfor~Nextでいけると思うのですが・・・ ここにあるのはあくまで一部なのでもっといっぱいあります。 どうスマートなコーディングをしたらいいか迷っています。 最後の0101とかは日付に近い形にしたいのですがここをどうループさせたらいいか迷っています。 フォーマットの関係で出来るだけ日付型は避けたいです。連続でセルに名前をふりたいのでお願いします。

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

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

  • VBAのapplication.ontime メソッドでの日付を超えた設定方法について

    VBAのapplication.ontime メソッドでの日付を超えた設定方法について EXCEL VBAを使って、2×10^n, 5×10^n, 10×10^n (n=2~6)秒ごとに 測定器からデータを取得する下のようなプログラムを作りました。 測定開始時刻から起算した時刻を表に書き込み、それを読み込んで application.ontimeで測定マクロを起動しようとするものです。 Dim clk, clk2, clk5, clk10 As Variant Dim i, j, n As Integer Sheet1.Range("A1") = Date Sheet1.Range("B1") = Time Sheet1.Range("C1") = Now Sheet1.Range("D1") = 6 '時刻表の読取り開始位置指定 n = 6 '時刻表の書込み開始位置指定 clk = Now '開始時刻設定 For i = 3 To 5 c2 = 2 * 10 ^ i Sheet1.Range("A" & LTrim(Str(n))) = c2 * 1000 '繰返し回数 2×10^i(k回) clk2 = DateAdd("s", c2, clk) '2×10^i(k回)の時刻計算 Sheet1.Range("B" & LTrim(Str(n))) = clk2 '時刻表への書込み mdate = CStr(Format(clk2, "yyyy/mm/dd")) '日付の抽出 mtime = Format(clk2, "h:m:s") '時刻の抽出 Sheet1.Range("C" & LTrim(Str(n))) = mdate '日付の書込み Sheet1.Range("D" & LTrim(Str(n))) = mtime '時刻の書込み n = n + 1 '時刻表書込み位置を1進める c5 = 5 * 10 ^ i Sheet1.Range("A" & LTrim(Str(n))) = c5 * 1000 clk5 = DateAdd("s", c5, clk) Sheet1.Range("B" & LTrim(Str(n))) = clk5 mdate = CStr(Format(clk5, "yyyy/mm/dd")) mtime = Format(clk5, "h:m:s") Sheet1.Range("C" & LTrim(Str(n))) = mdate Sheet1.Range("D" & LTrim(Str(n))) = mtime n = n + 1 c10 = 10 * 10 ^ i Sheet1.Range("A" & LTrim(Str(n))) = c10 * 1000 clk10 = DateAdd("s", c10, clk) Sheet1.Range("B" & LTrim(Str(n))) = clk10 mdate = CStr(Format(clk10, "yyyy/mm/dd")) mtime = Format(clk10, "h:m:s") Sheet1.Range("C" & LTrim(Str(n))) = mdate Sheet1.Range("D" & LTrim(Str(n))) = mtime n = n + 1 Next i For j = 6 To 14 mdate = Str(Sheet1.Range("C" & LTrim(Str(j)))) '測定日付読込み mtime = Sheet1.Range("D" & LTrim(Str(j))) '測定時刻読込み 待ち時間 = TimeValue("0時00分30秒") Application.OnTime (mtime) + DateValue(mdate), "measure", TimeValue(待ち時間) Next j End Sub 同日付の間は動くのですが、日付が変わると止まってしまいます。 Ontimeメソッドでは日付を指定すれば日付超え時刻指定ができると 聞き、日付、時刻を別の変数として指定する方法も試しましたが、型が一致しないエラーが出て困っています。 Application.OnTime TimeValue(mtime) + DateValue(mdate),  ・・・ 上手い設定方法はないものでしょうか

  • Excel VBAのFormulaでアプリケーションエラーが発生。

    Excel VBAのFormulaでアプリケーションエラーが発生。 フォーマットが統一された複数のExcelBookから特定の値を別のbookに一覧化するマクロを作成中ですが、エラーで止まり原因も分かりません。 for文で回してますが、エラーとなったコードをほぼそのまま書くと下記のような形です。 Cells(i, j).Formula = _ "=[" & Cells(i, 3).Value & "\]test!" & Cells(2, j).Value 上記の文字列「test」はbookのシート名です。 Cells(i, 3).Valueには  「C:\tmp\testbook.xls」 のようなbookのパスを Cells(2, j).Valueには  「A1」 のようなセル位置の文字列を記載し、  ='C:\tmp\[testbook.xls]test'!$A$1 という関数を代入したいのですが冒頭の通り、エラーで先に進まず原因も不明です。 対処方法を教えて頂ければと思います。 上記の関数をExcelに貼り付ければちゃんと値を表示します。 また、VBAのウォッチウィンドウでも関数は認識している様ですが、 Excelへの代入だけできません。 ちなみにCells(i, j).FormulaではなくCells(i, j).Valueでもダメでした。 非常に困っています。よろしくお願いします。

  • VBAのRangeオブジェクトについて

    いつもお世話になっております。 VBAのRangeオブジェクトについてご教示下さい。 例えば下記のPGを組みます。 Sub test() Dim r As Excel.Range Set r = Me.Range("A1") Debug.Print r.Cells.Count End Sub この時、Debug.Printには"1"と表示されます。 Debug.Printでブレイクを置き、ここでA列を削除するとDebug.printでエラーが出てしまいます。 Rangeオブジェクト生成後、もしも参照先のセルが削除してしまった場合、条件分岐の処理を入れたいのですが、どのように処理をいれればよろしいでしょうか? セル削除後、Rangeのプロパティを参照した時点でエラーが発生してしまいます。 Typeで確認するとRangeがちゃんと取れるのですが・・・。 "参照先のセルが消されたかどうか"を判別する方法はあるのでしょうか?

  • VBAのこの実行時エラーは何故起きる?

    ExcelVBAで次の大変簡単なコードを書いてみました。 シート上の行列(100*100)の範囲にランダムに☆印を100個表示するというものです。sheet1にコマンドボタンを貼り付け押すと実行します。ところが実行時エラーが起きて止まります。(メッセージ:”アプリケーション定義またはオブジェクト定義のエラーです”)原因はなんでしょうか?6行目が問題なようです。うまく動く時もあるので不思議です。 Private Sub CommandButton1_Click() Application.ScreenUpdating = False For n = 1 To 100 R = Int(Rnd * 100) C = Int(Rnd * 100) Sheet1.Cells(R, C).Value = "☆" Next Application.ScreenUpdating = True End Sub

専門家に質問してみよう