• 締切済み

VBAのglobalオブジェクトエラーについて

実績集計.xlsのマスターシートのA列の3行目のセルに「1」もしくは「スペース」が入っていて、1であれば隣の会社コード(0000775)をファイル名に付与して保存するというマクロを作成しています。 この行(code = Wsheet1.Range(counter, 2))でエラーが出ていて、「アプリケーション定義、オブジェクト定義」とエラーがでてしまいます。どなたかわかる方がいらっしゃいましたら教えて下さい。よろしくお願いいたします。 Sub 作成() Dim counter As Integer '行番号 Dim code As String '取引先コード Set Wsheet1 = Workbooks("実績集計.xls").Worksheets("マスター") counter = 3 Do While counter < 10 If Wsheet1.Range(counter, 1) = "1" Then code = Wsheet1.Range(counter, 2) Workbooks.Add ActiveWorkbook.SaveAs Filename:="実績集計" + "_" + code + ".xls" End If counter = counter + 1 Loop End Sub

みんなの回答

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

こんにちは。 すでに回答をしている人がいるので、こちらはコードとしては書くつもりはありませんが、はっきりしていない部分があるように思います。 ループの中に、 Workbooks.Open "C:\Documents and Settings\NS44730\デスクトップ\初期実績.xls" これでは、オーバーヘッドは掛かるし、保存したときに、ActiveBookが移動してしまうのですから、一回きりになるのはしかたがないと思います。ただ、開いたブックに対しては、名称をはっきりさせる必要はありませんが、最初のファイルの部分は回答側では分かりません。 #1の補足は、元の質問内容と単なる違いというではなく、コードの対象が違っています。それを繰り返されたら、永久に正解には結びつかないと思います。最初の質問が違っていたのか、それとも、途中で内容を変えたのか、いずれにしても、途中からファイルの対象や主旨を変えたら、我慢強い回答者でないと解答に至らない可能性が強いです。 基本的な疑問 (1) Do While counter < 10  ~ Loop なぜ、このようなスタイルのループを使わなくてはならないのでしょうか。 (2) >Workbooks("実績集計.xls").Worksheets("マスター") ここに、今回のマクロを置いてあるのでしょうか?それとも、別のブックなのでしょうか。 (3) Do While counter < 10 A列の3行目から9行目までで、1のフラグがあるのを探し、フラグがあれば、同じ行のB列の値を、コード番号とするわけでしょうか。 (4) デスクトップ上にある "初期実績.xls" の中身は同じものを、ファイル名だけを換えるというものでしょうか。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

No1です。 思うように動かないときに、自分で原因を突き止められることも大切です。 実行状況を確認する方法として、1ステップずつ実行させたり、途中経過の変数の内容を観察したりするという方法があります。 このほかにもVBAエディタには便利な機能が用意されています。 (ブレークポイントやウオッチ式、イミディエイトなど) あるいは、空きセルを利用して値を記入しておいたり、メッセージボックスを利用するなどの方法も有効です。 とりあえず > Do While counter < 10 の1行下に MsgBox (counter & ": " & Cells(counter, 1) & " " & ActiveWorkbook.Name & ActiveSheet.Name) とでも入れて実行してみてください。 (何度もボックスが出ますが、カウンターが8回と少ないので、これでも良いでしょう) その時点の、カウンターの値、A列のセルの内容、ブック名、シート名が表示されます。 表示される内容をよく観察すれば、ご自分で思っている内容と違うものが(どこかで)表示されるのがわかるはずです。 <解決へのヒント> セルの値を指定する場合、cells()やRange()のように記した場合は、暗黙的にアクティブブックのアクティブシートのセルとして解釈されます。 きちんと指定する必要がある場合は、 (ブック).シート.セル というように明示的に指定しなければなりません。 特に、シート間を照合したり、複数のブックを扱ったりする場合は注意が必要です。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Sub test02() counter = 2 Set Wsheet1 = Worksheets("Sheet1") 'code = Wsheet1.Range(counter, 2)) code = Wsheet1.Range("B" & counter) MsgBox code End Sub をB2にAAAと入れて実行するとAAAと表示されエラーにならない。 良くやる、RANGE(セル番地文字列)をCells(行数字、列数字または列番号文字列)と混同しているのではないか。 Cellsの()内はA1からの行と列の隔たりの数を指定する。 Range()の()内はアドレスやセル範囲名で指定する。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

単独セルを「行番号、列番号」で指定する場合は、通常Cells(Row,Column)を使用します。 Rangeの場合は、Range("A3")などの指定をするか、あるいは、範囲指定で Range(Cells(1,1),Cells(10,10)) みたいになります。 なので、ご質問の場合は、Cells(counter,1)のような指定にするか、Range("A" & counter) (正確に記せば、Range("A" & CStr(counter)) )のような指定方法のどちらかにすればよいと思われます。

toshiki090
質問者

補足

一度お答えいただいたにも関わらず、またも質問で大変恐縮なのですが、ご回答いただけたら幸いです。 コードを書き換えて初期実績_XXXXで出力されるようになったのですが、一つしか出力されません「1」を入力しているのは残り3つあるので3つ出力されるはずなのですが、なぜ最初のファイルしか出力されないのでしょうか?よろしくお願いいたします。 Sub ブック作成() Dim counter As Long '行番号 Dim code As String '取引先コード counter = 3 Do While counter < 10 If Cells(counter, 1) = "1" Then code = Cells(counter, 2) Workbooks.Open "C:\Documents and Settings\NS44730\デスクトップ\初期実績.xls" ActiveWorkbook.SaveAs Filename:="初期実績" & "_" & code & ".xls" End If counter = counter + 1 Loop End Sub

関連するQ&A

  • EXCEL2000とEXCEL2003のVBAについて

    現在、EXCEL2000で下記のコードを実行しています。 が、EXCEL2003で実行すると、 .UsedRange.Copy myb のコードが実行されているのにコピー出来ていません。 ファイルは開いていて、エラーは出ていないのです。 問題点わかる方教えていただけますか? Sub 日別データ読込() Dim rngsaki As Range Dim pathmacrobook As String Dim namebook As String Dim motobook As Workbook Dim myb As Variant Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2") pathmacrobook = ThisWorkbook.Path & "\CSV読込データ12\" namebook = Dir(pathmacrobook & "*.xls") Do While Not namebook = "" Set motobook = Workbooks.Open(pathmacrobook & namebook) Set myb = Workbooks("残高集計用.xls").Worksheets(3).Range("A65536").End(xlUp) With motobook.Worksheets("Sheet1") .UsedRange.Copy myb End With motobook.Close False namebook = Dir() Loop MsgBox "完了しました" End Sub

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

    人に教えなければいけないことなので、、、 困っています。 あるVBAのテキストを見て、そのテキストをそのまま入力しても実行できません。 (条件としては、Book1.xlsとBook2.xlsというファイルを開いた状態で、Book1.xlsのほうに、以下のモジュールを入力します。) Sub Set1() Dim myBook As Workbook Dim mySheet As Worksheet Dim myCell As Range Set myWBook = Workbooks("Book2.xls") Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") myWBook.Activate myWSheet.Activate myCell.Value = "ABC" End Sub これを実行すると、アクティブな状態のファイルにしか、値"ABC"が入ってこないのです。テキストでは、Book2.xlsのSheet2のA1:D10に値"ABC"が入ってくると言っていますが、Book1.xlsに値が入ってしまったりします。 長くなってしまってすみません。 もちろん、他の方法で実現することができるのはわかるのですが、なぜこのコードが実行できないのかがわかりません。 理由を教えていただけたら・・・と思います。 よろしくお願いいたします。

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • エクセルVBAのエラー

    よろしくお願いします。 VBA初心者のものです。 下記のコードを作成しましたが、 アプリケーション定義?がされていません というエラーが出ます。 わかりやすく教えていただけないでしょうか。 修正方法を教えてください。 0901名簿.xlsという名前の ファイルAのsheet1の 情報(ファイルBのセルBD1に日付4桁が記入されている)を ファイルBのセルA1の情報を元にファイルBのセルB1に抽出したい Sub 関数の挿入() Dim i As Long Dim あ As String Dim い As String Dim う As String あ="=VLOOKUP(A1,[" い=Range("BD1") う="名簿.xls]Sheet1!$F:$I,1,0)" For i = 2 To 50 Range("A" & i )= あ & い & う Next i End Sub

  • VBAエラー

    下のもので、 rangeクラスのselectメソッドが失敗しました がでてしまいます。 ★★★のところで止まってしまいます。 1つ目のエクセルで、ファイル名を入力、検索して開き、8行目でオートフィルタをするマクロです。 オートフィルタのところで止まります。 どこが悪いのか、ご教授いただけませんでしょうか。 よろしくお願い致します。 Sub ファイルを開く()  Dim str As String   Dim nCnt As Integer  Dim sHozon As String  Dim sFilename As String Dim Grp As String If Range("B2").Value <> "バーコード読み取り" Then '保存場所を指定 sHozon = "※※※" Grp = Right(Range("B2"), Len(Range("B2")) - InStr(Range("B2"), "F")) 'ファイル名を設定 sFilename = "AA" & Left(Range("B2"), 10) & ".xls" 'ファイルが存在しているか確認 str = sHozon & "\" & sFilename str = Dir(str) If (str <> sFilename) Then 'ファイルが存在しない場合、エラー MsgBox ("ファイルが存在しません") Else 'ファイルを開く Range("B2").Select Workbooks.Open sHozon & "\" & sFilename End If End If Workbooks(sFilename).Activate Sheets("B").Select ActiveSheet.Unprotect Workbooks(sFilename).Activate Rows("8:8").Select   ★★★ Selection.AutoFilter ActiveSheet.Range("$A$8:$BL$1008").AutoFilter Field:=58, Criteria1:=Grp

  • エクセルVBA!(COPY) Win2000,offce2000

    単純な質問かもしれませんが、 WorkBooks("test")から 別のWorkBooks("Data").WorkSheets("Sheet1")のデータの数を判定して全てをコピーして、 WorkBooks("test")のWorkSheets("Sheet2")へペーストしたいのですが、うまくいきません ↓のような感じです。 Dim wstest As Worksheet Dim wsData As Worksheet Dim wsNM As String Dim Drow As Long Sub copy() 'DataSheetのSheet名がその都度違うので、取得しました。 wsNM = wsData.Sheets(1).Name Set wsData = Workbooks("Data.xls").Worksheets(wsNM) Set wsTest = Workbooks("Test.xls").WorkSheets("Sheet2") 'データの範囲判定 Drow = wsData.Range("H65536").End(xlUp).Row '/////// ここからが???です /////// wsDataのA1からBAのDrowを範囲を指定して、Copy → wsTestのA1に貼り付けたいのですが、どうしたらよいのでしょうか? コピーしたり、直接書くようにしたりといろいろなコードを書いてみましたがダメでした。 Cellsで範囲をとる方法がわかりません。Rangeなら(A1:BA300)のように取れる範囲もCellsの時はどうしたらよいのでしょうか?(そのまま書けば、Cells(1,1):Cells(Drow,53)みたいな・・・・・) と、悩んでいるより一気にコピーするのもどうかと思いFor~Nextで1行ずつ書いていったらどうかとも考えましたが、うまくいきませんでした。 End Sub ※ Drowは、6000~20000 よろしくお願いします。

  • このコードの修正を、何卒よろしくお願い致します。

    EXEL 2002 です。 下記コードの修正を、何卒よろしくお願い致します。 ------ Sub コピー() Dim i As Integer For i = 1 To 2 Workbooks("コピー元.xls").Activate Worksheets(i).Range("A1", Range("C65536").End(xlUp).Offset(0, 168)).Copy _ Destination:=Workbooks("コピー先.xls").Worksheets(Workbooks("コピー先.xls").Sheets(1).Range("A1")) Next i End Sub

  • エクセルVBAの変数利用

    シートのC1セルに入力したブック名をアクティブにするための 変数なのですが、アクティブになりません。 下のようにしていますが、とのようにすればよいでしょうか? Sub test() Dim FileName As Range FileName = ThisWorkbook.Path & "\" & Sheets("sheet1").Range("C1") & ".xls" Workbooks.FileName.Activate End Sub

  • ワードのマクロからエクセルシートを開きデータを読み込む

    ワードマクロからエクセルシートのデータを読み込みたいのですが、マクロを実行すると「コンパイルエラー:変数が定義されていません。」というエラーが出てしまいます。変数xlUpで引っかかってるようなんですが、どのように定義すればよいですか? コードは以下です。 Dim Workbooks As Object Dim ecell As Integer Workbooks.Open FileName:="namesheet.xls" ecell = Workbooks("namesheet.xls").Worksheets(1).Range("B100").End(xlUp).Row よろしくお願いいたします。

  • VBA コード番号がない場合は、次の行へ進む

    OSはXPPro、 Excelは2003を使用しています。 入金データの「支店データ」シートのコード番号がマスタの表にある時、新シート(test)にコピーするマクロを作ろうと悪戦苦闘しています。 下記までは組んだのですが、「インデックスが有効範囲にありません」とエラーになってしまいます。 マスタにないコードだからだと思っているのですが、そういう場合は次の行のコード番号に進めるステートメントをどう組めば良いか分かりません。 どなたかご教示頂けると有り難いです。 よろしくお願い致します。 Sub test() Dim wb As Workbook Dim ws As Worksheet Dim mypath As String Dim fname As String Dim maxgyo As Long 'マスタの最終行 Dim intRow As Long 'マスタの行 Dim strMasCode As Long   'マスタのコード番号 Dim maxgyo2 As Long '入金データの最終行 Dim intRow2 As Long '入金データの行 Dim strSrhCode As Long '入金データのコード番号 Dim shingyo As Long '新シートの書き込み行 Worksheets.Add After:=ActiveSheet, Count:=1 '新しいワークシートを作成 ActiveSheet.Name = "test"            'そのシートの名前は[test] mypath = "C:\Documents and Settings\XXX\My Documents\XXX\" fname = "マスタ.xls" Set wb = Workbooks.Open(mypath & fname) '上記で指定したブックを開く Set ws = wb.Worksheets("担当マスタ")     '[担当マスタ]シートを指定 Workbooks("入金データ").Activate maxgyo = Sheets("支店データ").Cells(Rows.Count, 1).End(xlUp).Row '支店データの最終行 For intRow = 2 To maxgyo strSrhCode = Worksheets("支店データ").Cells(intRow, 6) shingyo = 1 shingyo = singyo + 1 Workbooks("マスタ").Activate maxgyo2 = Sheets("マスタ").Cells(Rows.Count, 2).End(xlUp).Row 'マスタの最終行 For intRow2 = 2 To maxgyo2 strMasCode = Sheets("マスタ").Cells(intRow2, 2) 'マスタのコード番号を代入 If strSrhCode = strMasCode Then 'マスタと支店データのコード番号が一致したら With Workbooks("入金データ").Worksheets("test") .Cells(shingyo, 1) = Worksheets("支店データ").Cells(intRow, 1) .Cells(shingyo, 2) = Worksheets("支店データ").Cells(intRow, 2) End With End If Next intRow2 Next intRow End Sub

専門家に質問してみよう