お世話になります。

早速ですが、
2003で作ったというexcelファイルを貰い、
動かしたところ、標題のようなエラーが出ます。
確認したところ作成環境は、
WindowsXPSP2、excel2003

そして、私の環境はWindows98SE、excel97です。
どのようなことでしょうか。

For Each minus In Sheets("結果").Range("m5:m59")
   If minus < 0 And minus.Interior.ColorIndex <> 3 Then
     With minus.Interior
     .ColorIndex = 3
     .Pattern = xlSolid
     .PatternColorIndex = xlAutomatic
   End With
     End If
    Next
(申し訳ありません、見苦しさはお許し下さい)

If minus < 0 And minus.Interior.ColorIndex <> 3 Then
でエラーになります。
型は「数値」で問題ないように思うのですが。

足らなければ指摘下さい、調べて追加します。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

 


対象となるセル(M5~M59)には式が入っていて、
その結果としてエラー値(#DIV/0!とか#VALUEとか#N/A等々)が返っているセルがありませんか?

エラー値があると質問のエラーが出ます。
確認してください。
以上。

この回答への補足

皆様どうも有り難うございました。
早速イロイロ教わったことを種してみました。
結果は
minus.valueとminus.textは同じ(エラー)でしたが、
val(minus)がうまくエラーを回避できました。
なぜwindows98とexcel97で駄目で
windowsXPとexcel2003ではokなのかは分かりませんが、
今回いい勉強をしました。
お礼が掛けないので、ここに書かせていただけました。
皆様どうもお世話になりました。

補足日時:2009/01/22 19:11
    • good
    • 0
この回答へのお礼

早速有り難うございます。

対象のセルは全て =if(n29="","",m29-m28)のような
式が入っています。
(あるセルに数字があるときだけ引き算をしてこの対象セルに結果を入れる)

ただ、エラーにはなっていませんがスペースは在ります。
エラーはないのですが、スペースでエラーになるのでしょうか。
宜しくお願いします。

お礼日時:2009/01/22 10:59

#2です。



> エラーはないのですが、スペースでエラーになるのでしょうか。
エラーになりますね(なりました)。

「If IsNumeric(minus) = True Then」とか入れた方がよさそうですね。

この回答への補足

作成者に確認しました。
WindowsXP、excel2003では
スペースが在っても問題なく動くらしいです。
(スペースは対象になりませんので色は付きませんが)
兎に角私の環境でやってみます。

補足日時:2009/01/22 12:11
    • good
    • 0
この回答へのお礼

何回も有り難うございます。
スペースでエラーになるというので原因は分かったので明るさが出た感じです。
対応策で教えていただいたことをやってみます。
兎に角今は触れませんので、後ほど報告させてください。
有り難うございました。

お礼日時:2009/01/22 12:10

う~む?手元にWindows98SE、excel97という環境は無いので自信は無いですが。

minus が セルそのものとして扱われているのでしょうか・・・。No1、akina_lineさんの方法でもだめなら、
> If minus < 0 And minus.Interior.ColorIndex <> 3 Then
 If Val(minus.Value) < 0 And minus.Interior.ColorIndex <> 3 Then
とか
 If Val(minus.Text) < 0 And minus.Interior.ColorIndex <> 3 Then
とか書くとどうなるでしょうか?

この回答への補足

皆様どうも有り難うございました。
早速イロイロ教わったことを種してみました。
結果は
minus.valueとminus.textは同じ(エラー)でしたが、
val(minus)がうまくエラーを回避できました。
なぜwindows98とexcel97で駄目で
windowsXPとexcel2003ではokなのかは分かりませんが、
今回いい勉強をしました。
お礼が掛けないので、ここに書かせていただけました。
皆様どうもお世話になりました。

補足日時:2009/01/22 19:10
    • good
    • 0
この回答へのお礼

早速有り難うございます。
いろいろな書き方があるのですね、
兎に角皆さんに教わったことをやってみます。
後ほど報告します。
有り難うございました。

お礼日時:2009/01/22 10:50

エラーにならずに、正常に動いているようですが…


Excelは97ですが、OSが違うのでなんとも…

・WinXP Home SP3
・Excel97 SR-2
・「結果」シートのM5~M59に-100、-90…(略)…-10、0、10…(略)…90、100、-100、-90…って感じに数値を入力。
・VBA側「ThisWorkBook」にコード貼り付け。以下参照。
Option Explicit
Public Function Test()
Dim minus
  For Each minus In Sheets("結果").Range("m5:m59")
    If minus < 0 And minus.Interior.ColorIndex <> 3 Then
      With minus.Interior
        .ColorIndex = 3
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
      End With
    End If
  Next
End Function

◎結果:-100~-10が入力されているセルが赤くなる。

ご参考まで。

この回答への補足

皆様どうも有り難うございました。
早速イロイロ教わったことを種してみました。
結果は
minus.valueとminus.textは同じ(エラー)でしたが、
val(minus)がうまくエラーを回避できました。
なぜwindows98とexcel97で駄目で
windowsXPとexcel2003ではokなのかは分かりませんが、
今回いい勉強をしました。
お礼が掛けないので、ここに書かせていただけました。
皆様どうもお世話になりました。

補足日時:2009/01/22 19:09
    • good
    • 0
この回答へのお礼

早速有り難うございます。
作成者も全く問題なく動くと言っています。
Windows98と、excel97の組み合わせでしょうか。
兎に角皆さんに教えていただいたことをやってみます。
後ほど報告いたします。
有り難うございました。

お礼日時:2009/01/22 10:35

こんにちは。



 手元にExcel97が無いので、自信がありませんが、
 minus < 0
  ↓
 minus.value < 0
 としたら、どうでしょう。

では。

この回答への補足

皆様どうも有り難うございました。
早速イロイロ教わったことを種してみました。
結果は
minus.valueとminus.textは同じ(エラー)でしたが、
val(minus)がうまくエラーを回避できました。
なぜwindows98とexcel97で駄目で
windowsXPとexcel2003ではokなのかは分かりませんが、
今回いい勉強をしました。
お礼が掛けないので、ここに書かせていただけました。
皆様どうもお世話になりました。

補足日時:2009/01/22 19:03
    • good
    • 0
この回答へのお礼

早速有り難うございます。
今確認できないので、
後ほど確認して報告させていただきます。
有り難うございました。

お礼日時:2009/01/22 10:01

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q型が一致しない というエラー

Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("B1") Then
Range("B3:B8").Select
Selection.ClearContents
End If
End Sub

というコードを書いています。
B3~B8は「数字」という書式です。

型が一致しない13番のエラーが出ます。

原因と対処法を教えてください。
宜しくお願いします。

Aベストアンサー

こんばんは。

#2の回答者です。
>セルB1に引き金のキーワードが入ります。
なるほど、意味が分かりました。

キーワードが、例えば、「keyword」なら、以下のようにすればよいです。
And Target.Value = "keyword" Then (流れは、下のコードを参照してくださいょ
一応、Binary 比較ですから、大文字・小文字は別になります。
複数の場合などは、またおっしゃってください。少し、ややこしくなります。

Text 比較の場合は、大文字・小文字は同じになりますが、
And StrComp(Target.Value, "keyword", vbTextCompare) = 0 Then

としてあげます。他にも、Like演算子などもありますが、オプション・コンペア・ステートメントが必要になってしまいます。

> Application.EnableEvents = False
これを入れないと、新たにイベントが発生してしまいます。
しかし、
>Application.EnableEvents = True
終わった後に、イベントの発生を戻さないと、次回、イベント起動しません。

もちろん、それを無視して、コードが再帰しても、入り口で、弾かれるようなコードをおいておけば、二度目は弾かれるのですが、制御しないままよりも、このような場合、基本的に、EnableEvents でイベントを止めます。これは、ステップ・モードでみれば分かります。

'//
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Count > 1 Then Exit Sub 'セル値が複数の場合は除外
 If Target.Address = "$B$1" And Target.Value = "keyword" Then '←KeyWord
  Application.EnableEvents = False 'イベントの中断をしないと、新たにイベントが発生
  Range("B3:B8").ClearContents
  Application.EnableEvents = True
 End If
End Sub
'//

こんばんは。

#2の回答者です。
>セルB1に引き金のキーワードが入ります。
なるほど、意味が分かりました。

キーワードが、例えば、「keyword」なら、以下のようにすればよいです。
And Target.Value = "keyword" Then (流れは、下のコードを参照してくださいょ
一応、Binary 比較ですから、大文字・小文字は別になります。
複数の場合などは、またおっしゃってください。少し、ややこしくなります。

Text 比較の場合は、大文字・小文字は同じになりますが、
And StrComp(Target.Value, "keyword", vbTextC...続きを読む

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。

Q【エクセルVBA】「インデックスが有効範囲にありません」というエラーがでます

こんにちは。VBA初心者ですが、下記コードを実行すると
エラーが出てしまいました。

シート(シート1)のセルから別シート(シート2)のセルに
値のみコピーするVBAを組んでいます。
適宜、シート1に入力したものを読みこませていきたいので
変数を使用しています。

-------------------------------------------------------------
Sub セルのコピー()

Dim X As Integer

X = 3
Y = 2
Do While Cells(X, "A").Value <> ""
Sheets("シート1").Cells(X, "A").Copy

Sheets("シート2").Activate
Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
Application.CutCopyMode = False

X = X + 1
Y = Y + 1

Loop

End Sub

------------------------------------------------------------
つまり、シート1のA3セルを先頭にA4,A5,A6・・・と続くセルの値
をシート2のF2を先頭としたセル(以下、F3,F4・・・)に値のみコピー
していきたいのですが。。

実行すると「インデックスが有効範囲にありません」というエラーが
でます。デバック対象は上記、「⇒エラー対象」の構文です。

変数の設定の仕方がおかしいのでしょうか。。
ご教示のほどよろしくお願いいたします。

こんにちは。VBA初心者ですが、下記コードを実行すると
エラーが出てしまいました。

シート(シート1)のセルから別シート(シート2)のセルに
値のみコピーするVBAを組んでいます。
適宜、シート1に入力したものを読みこませていきたいので
変数を使用しています。

-------------------------------------------------------------
Sub セルのコピー()

Dim X As Integer

X = 3
Y = 2
Do While Cells(X, "A").Value <> ""
Sheets("シート1").Cells(X, "A").Copy

Sheets("シート2").Activat...続きを読む

Aベストアンサー

>Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
で、「PasteSpecial _ Paste:=xlPasteValues」 の “_” を消去してください。
また、
 Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき、
 Do While Cells(X, "A").Value <> "" の Cells(X, "A") は "シート2" の Cells(X, "A") を見に行きますので、 思っているような動作はしません。
 最後の Loop の前に、 Sheets("シート1").Activate を入れるか、While の後の Cells(X, "A").Value の頭に、Sheets("シート1"). をつければ、この問題を回避することができます。

コピー先のシートは、アクティブにしなくても、ペーストする方法があります。

あなたのコードを少し変更します。

 Sub セルのコピー2()
   Dim X As Integer, Y As Integer

   X = 3
   Y = 2
   Do While Cells(X, "A").Value <> ""
     Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")
     X = X + 1
     Y = Y + 1
   Loop
   Application.CutCopyMode = False
 End Sub

注) 使っているブラウザの見る条件によって、「Sheets("シート1").Cells(X, "A").Copy Destination:=Sheets("シート2").Cells(Y, "F")」と「Destination:=Sheets("シート2").Cells(Y, "F")」が2行になったように見えることがあるかもしれません。 2つのコードはスペースを1つはさみ、続けて書いてください。

変更したコードの場合、"シート1" が常時表示されたままになります。

行数が200行くらいとのこと、速度を早くしたい場合は、最初に
 application.ScreenUpdating=False
最後に、
 application.ScreenUpdating=True
を加えます。

なお、シート名は "Sheet1" ですか、"シート1"ですか、どちらかに揃えましょう。 、"シート1"と、"シート2"がブックの先頭から順になっているときは、シート名を使わなくてそれぞれ Sheets(1)、Sheets(2) でもいけます。 (1)、(2) は左から 1番目のシート、2番目のシートという意味です。

試してみてください。

>Sheets("シート2").Cells(Y, "F").PasteSpecial _ Paste:=xlPasteValues ⇒エラー対象
で、「PasteSpecial _ Paste:=xlPasteValues」 の “_” を消去してください。
また、
 Sheets("シート2").Activate で "シート2" を Activate にすると、 Do Loop の頭に返ってきたとき、
 Do While Cells(X, "A").Value <> "" の Cells(X, "A") は "シート2" の Cells(X, "A") を見に行きますので、 思っているような動作はしません。
 最後の Loop の前に、 Sheets("シート1").Activate を入...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QVBAでのMATCH関数の使用

現在,VBAにてシートの比較プログラムを行っておりますが,その中で検索範囲を示すRangeに名前を使用したいのですがエラーでうまくいきません。

エラーは
「実行時エラー:1004
WorksheetFunctionクラスのMatchプロパティが取得できません」
とでます。

記述は

Application.WorksheetFunction.Match(Cells(r, 132), Range("リース型具Key1"), 0)

としており,”リース型具Key1”が事前に名前登録してある名前です。

方法をご存知の方,よろしくお願いします。

Aベストアンサー

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As Integer
    shtNo = 2
  Dim ws2 As Worksheet
  Dim ws3 As Worksheet
    Set ws2 = Worksheets("Sheet" & shtNo)
    Set ws3 = Worksheets("Sheet3")

  On Error GoTo ErrorTrap
  
  MsgBox Application.WorksheetFunction.Match(ws2.Cells(2, 2), _
                       ws3.Range("リース型具Key1"), 0)
  '
  '// 色々な処理 //
  '
  Set ws2 = Nothing
  Set ws3 = Nothing

  Exit Sub

ErrorTrap:
  MsgBox ws2.Cells(2, 2) & "は見つかりません。"
  Resume Next
End Sub

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

QVBA アプリケーション定義またはオブジェクト定義エラーについて

doc_wbkというブックのSheets(2)の内容をdoc_wbk2のActiveSheetにコピーしようとしています。
以下のコードの5行目で「アプリケーション定義またはオブジェクト定義エラー」が出てしまいます。ブックやシートまで指定しないといけないのかと思い doc_wbk.Sheets(2) を5行目行頭に追加しましたが変わりません。逆に5行目行頭の . を外してやるとアクティブシートの内容をコピーしてしまいます。Sheets(2)の内容をコピーしてやるにはどうしたらよいでしょうか?よろしくお願いします。

Set doc_wbk = Workbooks.Open(doc_dir + doc_file, 0)
With Sheets(2)
If .Range("A4").Value <> "" Then
row_num = .Range("a65536").End(xlUp).Row
.Range(Cells(4, 1), Cells(row_num, 11)).Copy doc_wbk2.ActiveSheet.Cells(row_num2 + 1, 1)
End If
End With

doc_wbkというブックのSheets(2)の内容をdoc_wbk2のActiveSheetにコピーしようとしています。
以下のコードの5行目で「アプリケーション定義またはオブジェクト定義エラー」が出てしまいます。ブックやシートまで指定しないといけないのかと思い doc_wbk.Sheets(2) を5行目行頭に追加しましたが変わりません。逆に5行目行頭の . を外してやるとアクティブシートの内容をコピーしてしまいます。Sheets(2)の内容をコピーしてやるにはどうしたらよいでしょうか?よろしくお願いします。

Set doc_wbk = Workbooks.O...続きを読む

Aベストアンサー

CellsとRangeが別々のシートを見ているためです

単に Cellsと書いてしまうと Withから外れてしまいます
.Range( Cells(4,1), Cells(row_num,11) )
と記述すると RangeはSheets(2) Cells(4,1)とCells(row_num,11)はActiveSheetになります
これでは Excelは困ってしまうわけです

.Range( .Cells(4,1), .Cells(row_num,11) )
とWithが掛かるように『.Cells』と記述しましょう


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報