痔になりやすい生活習慣とは?

毎日更新されるCSVファイルがあります。
このファイルをExcelに変換して、他のファイルにリンクしています。
CSVファイルを開かなくても、データを更新できるよう、マクロを組みました。
Excel2000では、問題なく動くのですが、’97で実行すると、
実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。
メインに使っているPCが'97なので、
色々調べてみたのですが、私の知識ではわからず、困っています。
詳しい方がいらっしゃれば、教えて頂きたく思います。
コードは以下のようなものです。

Private Sub Workbook_Open()

Dim Workbooks As Variant
Dim Sheets As Variant
Dim Filename As Variant
Dim wR As Long

ThisWorkbook.Sheets("Sheet1").Activate
Cells.ClearContents
Filename = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")

ここで、デバック
   ↓
  With ActiveSheet.QueryTables.Add _
(Connection:="TEXT;" & Filename, Destination:=Range("A1"))
.TextFileCommaDelimiter = True

さらにここでも、デバック(実行時エラー1004 外部データ範囲を
更新するためのテキスト ファイルが見つかりません)
      ↓
.Refresh BackgroundQuery:=False

End With

With ActiveSheet
.Columns("B:C").Delete shift:=xlToLeft
'(CSVファイルのA,B列は不要のため、削除)
wR = .Range("B" & Rows.Count).End(xlUp).Row
.Range("A1") = "=B1&C1&D1"
.Range("A1").AutoFill Destination:=Range("A1:A" &wR), Type:=xlFillDefault

End With

End Sub

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

A 回答 (6件)

追伸:



#換えればよいだけです
ちょっと、バカなことを書いてしまいました。(^^;
ではなくて、統一してしまえばよいです。

>#If numVer = 8 Then   'ディレクティブ
>   LineBuf = ex97Split(TextLine, DELIM)
>   #Else
>   LineBuf = Split(TextLine, DELIM)
>#End If
   ↓

LineBuf =ex97Split(TextLine,DELIM)
としてしまってください。

この回答への補足

ありがとうございます。
試してみて、必ず結果をご報告致します。

補足日時:2007/06/27 15:59
    • good
    • 0
この回答へのお礼

このコードに替えたら、上手くいきました!!
しばらく悩んでいたので、とてもうれしいです。
本当にありがとうございました!!

お礼日時:2007/06/28 11:42

こんにちは。



やはり、ダイレクティブがうまく行っていないようですね。初めて使うワザだったので、私は、勉強不足でした。その部分は、勉強しなおします。今回には、間に合いそうにはありませんが、前の文章に触れていましたが、直し方は、簡単です。

>   LineBuf = Split(TextLine, DELIM)
>         ↑ここが反転

その反転したものを、

   LineBuf = ex97Split(TextLine, DELIM)
   
に換えればよいだけです。一応、97では確認済みです。
    • good
    • 0

こんにちは。



一応、こちらで、その後で、Excel 97 に通して可動は確認しました。
私は、なるべく、標準モジュールに、これらを入れてあったほうが負担が少ないと考えていますが、もう一度調べてみます。

>>LineBuf = ex97Split(TextLine, DELIM)
>の Split が反転した状態でエラーになるとのことでした。

この意味が、もう少し複雑な状況かもしれません。厳密にどこの部分なのかはっきりすればよいのですが、そうでないと、探すのに苦労します。

それで、だめなら、もう一度、ダイレクティブ(#IF)分岐で、コードの完全分離に切り替えます。

この回答への補足

こんばんは。
お返事が遅くなってしまい、大変申し訳ありません。
(別のファイルで悪戦苦闘してしまったので、こちらのファイルになかなか取り掛かれませんでした)

本日、自分で試してみたところ、
「sub 又は functionが定義されていません」
とエラーが出てしまいました。

#If numVer = 8 Then   'ディレクティブ
   LineBuf = ex97Split(TextLine, DELIM)
   #Else
   LineBuf = Split(TextLine, DELIM)
         ↑ここが反転
 何かまだ、設定の足りないものや、省略しない方が良い
コードがあるのでしょうか?
 社内にはマクロのわかる人がいない為、Wendy02さんのご回答のおかげで何とかやっていけている状況です。
お手隙の時でも構いませんので、どうぞ宜しくお願い申し上げます。

補足日時:2007/06/27 00:09
    • good
    • 0

こんばんは。



今回のマクロは、私のとってはやはり難しかったです。初めて使うワザもあります。
初めて使うワザやお蔵入りのワザがうまく動くかどうかです。なんと言っても、Val 関数も97でないことに気がつきました。本当は、ちゃんと97をインストールしたほうがよいとは思うのですが、そのためには、今までの上位バージョンをアンインストールしなければならないのです。うまくいかなければ、また、手直しするつもりです。

それから、ご自身で作られたものかはわかりませんが、
>Dim Workbooks As Variant
>Dim Sheets As Variant

これは、絶対いけません。Excel VBAを知らない人で、VBを書く人に時々見られる変数ですが、エラーにはならないのですが、予約語として考えたほうがよく、それを使ったら、場合によっては、そのオブジェクトを殺してしまいます。

なお、ex97Split だけでも、上位バージョンで動くはずです。ただ、Split 関数よりも、多少処理スピードが遅いのです。

>Wendy02さんが、OpenText や QueryTables は、相性の良くないコードだから、あまり使わない方が良いと書かれていた解答は目にしていたのですが、

私が書いたのは、ひとつは引数を確証なく省略すると失敗することがあると書いたのと、QueryTable を貼り付けた後は、その内部のQueryTable を削除したほうが後々処理に困らない、と書いたのです。

そういう私は、ここ1年半ぐらいは、QueryTables を使ってお終いにすることもあります。理由は、皆が自分の手でマクロを書けるように願い、記録マクロを使って、ちょっと加工するだけで、こんなものが出来ることを分かってもらうために書いています。

中には、バカにされたと誤解する人もいるようですが、結果が同じなら、少しぐらい処理スピードが遅くても、簡単なほうがよいと思います。Visual Basic のように難しい書き方よりも、VBAは、VBAの書き方があってもよいのではないか、と思っています。そんな私でも、今回のように避けられない時もあります。



'ThisWorkbook モジュール
'------------------------------------------------
Private Sub Workbook_Open()
 Call CSVImportMacro
End Sub


'標準モジュール
'------------------------------------------------
Sub CSVImportMacro()
Dim FName As String
Dim Fno As Integer
Dim TextLine As String
Dim numVer As Integer 'ディレクティブIfの外で取るため
Dim LineBuf As Variant
Dim Ub As Integer
Dim i As Long
Const DELIM As String = "," '区切り文字
Const START As String = "B1" 'B1 から
Const LINESTART As Integer = 3 '3列目から

 With ActiveWorkbook.Worksheets("Sheet1")
   .Activate
   .UsedRange.ClearContents
 
 FName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")
 If StrComp(FName, "False") = 0 Or FName = "" Then Exit Sub
 Fno = FreeFile()
 Open FName For Input As #Fno
 Do Until EOF(Fno)
  Line Input #Fno, TextLine
   TextLine = Application.Substitute(TextLine, """", "") 'Quotationを取る
   numVer = Left$(Application.Version, 2)
   #If numVer = 8 Then   'ディレクティブ
   LineBuf = ex97Split(TextLine, DELIM)
   #Else
   LineBuf = Split(TextLine, DELIM)
   #End If
   Ub = UBound(LineBuf)
   If Ub > LINESTART - 1 Then
   LineBuf = IndexLineArray(LineBuf, LINESTART - 1) '配列なので、-1
   Ub = UBound(LineBuf)
   .Range(START).Offset(i).Resize(, Ub).Value = LineBuf
   i = i + 1
   End If
 Loop
 Close #Fno
 .Range("A1", .Range("B65536").End(xlUp).Offset(, -1)).FormulaLocal = "=B1&C1&D1"
 .Range("A1").EntireColumn.AutoFit
 End With
End Sub
Private Function IndexLineArray(ByVal BaseArray, Optional StartCol As Integer = 0, Optional EndCol As Integer = 0)
'配列切り分け BaseArray =配列, StartCol スタート列(-1), EndCol =終了列(-1)
Dim v As Variant
Dim i As Integer
Dim Ar() As Variant
Dim cnt As Integer
cnt = 0
For Each v In BaseArray
 If cnt >= StartCol And EndCol = 0 Then
 ReDim Preserve Ar(i)
  Ar(i) = v
 i = i + 1
 ElseIf cnt >= StartCol Then
  If cnt <= EndCol Then
   ReDim Preserve Ar(i)
   Ar(i) = v
   i = i + 1
  End If: End If
 cnt = cnt + 1
Next v
IndexLineArray = Ar()
End Function

Private Function ex97Split(TextLine As Variant, Optional DELIM As String = ",")
'Excel97 用Split関数
Dim OutPutArray() As Variant
Dim LineLength As Integer
Dim i As Long
Dim FirstLocate As Integer
Dim FindLocate As Integer
Dim WordLen As Integer
Dim QtFind As Integer
Dim QtNetFind As Integer
Dim QtFlg As Boolean

LineLength = Len(TextLine)
If LineLength = 0 Then Exit Function
FirstLocate = 1
 Do
 QtFind = InStr(FirstLocate, TextLine, Chr(34))
 FindLocate = InStr(FirstLocate, TextLine, ",")
 If FindLocate = 0 Then
 If Len(Mid$(TextLine, FirstLocate)) > 0 Then
  ReDim Preserve OutPutArray(i)
  OutPutArray(i) = Mid$(TextLine, FirstLocate)
 End If
 Exit Do
 End If
 
 If QtFlg Or QtFind = 1 Then
 QtNetFind = InStr(QtFind + 1, TextLine, Chr(34))
 WordLen = QtNetFind - QtFind - 1
 ReDim Preserve OutPutArray(i)
 OutPutArray(i) = Mid$(TextLine, QtFind + 1, WordLen)
 FirstLocate = QtNetFind + 2
 QtFlg = False
 Else
 WordLen = FindLocate - FirstLocate
 ReDim Preserve OutPutArray(i)
 OutPutArray(i) = Mid$(TextLine, FirstLocate, WordLen)
 FirstLocate = FindLocate + 1
 End If
 'オプショナル
 If QtFind = 2 Or FindLocate + 1 = QtFind Then
   QtFlg = True
 End If
 i = i + 1
Loop
 ex97Split = OutPutArray()
End Function

この回答への補足

こんなに複雑なコード、ありがとうございます。
その他の点につきましても、丁寧に教えて頂き、感謝この上ありません。

自分の使っているPC(2000)では、正常動作しました。
'97がインストールされているPCが私の勤務時間中、空かなかったので
手が空いたら、試してくれるようお願いしておいたところ、

>LineBuf = ex97Split(TextLine, DELIM)
の Split が反転した状態でエラーになるとのことでした。
ただ、実行して頂いた方は、ほとんどBVAは知らないので、
エラーメッセージの内容も、確認できていない状態です。
せっかくコード書いて頂いたのに、すみません。

明日、自分でもう一度試してみて、結果をご報告したいと思います。
少々、ご猶予下さいませ。

補足日時:2007/06/21 23:36
    • good
    • 0

こんばんは。



>Cells.ClearContents  の後ろに入れてみましたが、
「実行時エラー424 オブジェクトが必要です」が出てしまいます。

これは、ActiveSheet.Cells.ClearContents とかしないと、ThisWorkbookなどは、ローカル・オブジェクトとしてのシートが存在しません。

ですが、簡単だと思っていたら、今、間違いに気が付きました。

Workbooks.OpenText _

これでは、そのファイル自体を開けてしまうことですね。それをコピーしなければならないのでは、話が違ってしまいます。私は、97用のこの内容のコードはギブアップしたことがあり、97で、この関連のコードは、それ以来何年も試したことがありません。

まず、配列のSplit関数が97にはないので、自分で作らなくてはなりません。上位バージョンで作って、最後に97に入れてみないと、一体、どこがエラーが出るか分からないのです。これは、私には、この部分を中途半端に知っているだけに大変な内容です。以前は、定番だったこのコードも、今は、見られないコードです。

それに、ExcelのVersion によってコードを換えるプログラムを書かなくてはなりません。統一的なコードは出来ません。甘く見すぎていました。少し、時間をください。

この回答への補足

こんばんは。
>甘く見すぎていました<いえ、甘く見ていたのは、私の方です。
部分的に少しだけ書き換えれば済むものと思っていました。
Wendy02さんが、OpenText や QueryTables は、相性の良くないコードだから、あまり使わない方が良いと書かれていた解答は目にしていたのですが、VBAに取り組んで1ヶ月あまりの私には、他のコードの書き方がわからず、行き当たりばったり的にマクロを組んでいました。
>配列のSplit関数が97にはないので、自分で作らなくてはなりません。
このことも全く知らず、お恥ずかしい限りです。
お手数をかけてしまって、本当に申し訳ありません。

やりたいことは、QNo.3084424 のままです。
この、ExcelファイルのA列(関数式)をVlookupの検索値として、他のファイル使用しています。
 今のところ、問題なく検索できているので、もしかしたら、文字列で取り出す必要はないのかもしれません。
(たまたま、探し出したコードに、文字列を取り出すコードが含まれていため、そのまま引用してしまいました。)
 バージョンの違いで、これほど大変なことになるとは、思いもかけないことでした。
 大変なご迷惑とは思いますが、どうぞよろしくお願い致します。

補足日時:2007/06/20 00:49
    • good
    • 0

こんばんは。



Excel 97 で、

>ActiveSheet.QueryTables.

というのは可能なのでしょうか?97にはなかったはずです。

単に、Workbooks.OpenText Filenames:= ......
で、TextQualifier を決めてあげる方法で出来たはずです。

その部分を交換すれば、出来ると思います。

この回答への補足

ご回答ありがとうございます。
>ActiveSheet.QueryTables 
が'97でないということは、知りませんでした(汗)

甘えてしまって申し訳ないのですが、
>Workbooks.OpenText Filenames
はどのように設定したら、良いのでしょうか?

Cells.ClearContents  の後ろに入れてみましたが、
「実行時エラー424 オブジェクトが必要です」が出てしまいます。
(意味がわかっていなくて、ネット上から探してきたコードを貼り付けていますので、不要なものも入っているかと思いますが…)

Workbooks.OpenText _
Filename:=Flname, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlTextQualifierDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, _
FieldInfo:=Array(Array(1, 1), Array(2, 1))
   ↑
今のコードでは、後でAB列を削除しているのですが、(ExファイルのA列には数式を設定、B列以降にデータ貼り付け) 
必要なのはCSVファイルのC:H(数字ですが、頭の00も抽出したいため)ですので、必要な列だけを選択するコードが入れられれば、いいと思うのですが、このコードがどこを指しているのが、理解していないままです。
なさけないこと、この上ないのですが、教えて頂ければ幸いです。
どうぞお願い致します。

補足日時:2007/06/19 17:06
    • good
    • 0

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

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

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

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

Qエクセル マクロ実行時エラー’1004’

For~Next構文内でシートコピーしていると途中で、
実行時エラー'1004’
WorksheetクラスのCopyメソッドが失敗しました。
が表示されることがあります。

該当のFor~Next文は10回以上実行されているので、コードの誤りではないと思うのですが、なぜ「Copyメソッドが失敗」するのかわかりません。
理由/対処方法がわかればありがたいと思い質問させていただきます。

**該当コード**
Sub 評価シート作成()
  Sheets(社員一覧).Select
  行 = 1
  Do
    ReDim Preserve 社員CD(行)
    ReDim Preserve 氏名(行)
    社員CD(行) = Cells(行 + 1, 1).Value
    氏名(行) = Cells(行 + 1, 2).Value
    行 = 行 + 1
  Loop Until Cells(行, 1) = ""
  人数 = 行 - 2
  For 回数 = 1 To 人数
    Sheets(評価シート).Select
    Sheets(評価シート).Copy after:=Sheets(評価シート)
    ActiveSheet.Name = 氏名(回数)
    Cells(4, 5) = 氏名(回数)
    Cells(4, 3) = 社員CD(回数)
  Next 回数
End Sub
*****************************
よろしくお願いします

For~Next構文内でシートコピーしていると途中で、
実行時エラー'1004’
WorksheetクラスのCopyメソッドが失敗しました。
が表示されることがあります。

該当のFor~Next文は10回以上実行されているので、コードの誤りではないと思うのですが、なぜ「Copyメソッドが失敗」するのかわかりません。
理由/対処方法がわかればありがたいと思い質問させていただきます。

**該当コード**
Sub 評価シート作成()
  Sheets(社員一覧).Select
  行 = 1
  Do
    ReDim Preserve 社員CD(行)
   ...続きを読む

Aベストアンサー

ひょっとしてこれに該当するのかな?

Excel でプログラムを使用してワークシートをコピーするとランタイム エラー 1004 が発生する
http://support.microsoft.com/kb/210684/ja

QExcel2007VBAファイルの表示について

●質問の主旨

開いたダイアロボックス内のファイルについてエクセルファイル(.xlsxのみ)を
対象としたいと考えています。
下記コードをどのように書き換えればよいでしょうか?
ご存知の方ご教示願います。私はVBA初心者です

●質問の補足

作成した下記のコードでは

「実行時エラー1004:GetOpenFilenameメソッドに失敗しました」

と表示されます。

参考書2冊読んで全くその通りに引用していて、なぜエラー表示に
なるのかよく分かりません。

またTarget = Application.GetOpenFilename("Excelブック,*,xlsx")を
Target = Application.GetOpenFilename()にするとダイアロボックスは
表示され、その中にあるエクセルファイルは表示されます。

●コード

Sub Sample3()

Dim Target As String
Target = Application.GetOpenFilename("Excelブック,*,xlsx")
If Target <> "False" Then
Workbooks.Open Target
Else
MsgBox "キャンセルされました"
End If

End Sub

●質問の主旨

開いたダイアロボックス内のファイルについてエクセルファイル(.xlsxのみ)を
対象としたいと考えています。
下記コードをどのように書き換えればよいでしょうか?
ご存知の方ご教示願います。私はVBA初心者です

●質問の補足

作成した下記のコードでは

「実行時エラー1004:GetOpenFilenameメソッドに失敗しました」

と表示されます。

参考書2冊読んで全くその通りに引用していて、なぜエラー表示に
なるのかよく分かりません。

またTarget = Application.GetOpenFilename("Excelブック,*,x...続きを読む

Aベストアンサー

Target = Application.GetOpenFilename("Excelブック,*,xlsx")
タイプミス。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Q「Excel VBA」 Webクエリ マクロ「実行時エラー"1004"ファイルにアクセスできませんでした」

Webクエリを使って、「Yahooファイナンス」から日経平均株価の時系列データを取得したいのですが、うまくいきません。(TT)
下記に全コードを記載しますので、ご回答よろしくお願いします。

Dim url As String
Dim lastrow As Integer
Dim i As Integer

Sub Calc()
'価格データを取得するマクロ

'このマクロ内で用いる各変数を宣言
Dim code As String
Dim day_s As Integer, month_s As Integer, year_s As Integer
Dim day_e As Integer, month_e As Integer, year_e As Integer
Dim row_length As Integer

'変数に各値を代入
code = "998407.o" '株価コード
day_e = 31 '取得終了日
month_e = 12 '取得終了月
year_e = 2005 '取得終了年
day_s = 1 '取得開始日
month_s = 1 '取得開始月
year_s = 2005 '取得開始年

'価格データを取得
For i = 0 To 365 * 0.65 Step 50

'変数にURLを代入
url = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv"

'1回目の繰り返しの場合
If i = 0 Then
lastrow = "4"
Call Get_Data

'価格データが取得できなかった場合、マクロを終了させる
    If Range("B4") = "" Then
Exit Sub
End If

'2回目以降の繰り返しの場合
Else
lastrow = Range("B4").End(xlDown).Row + 1
Call Get_Data

'見出しのセルを削除
Range("B" & lastrow, "H" & lastrow).Delete
row_length = Range("B4").End(xlDown).Row

'価格データが取得期間分存在していなかった場合、その時点で繰り返しを終了させる
If row_length - lastrow < 49 Then
Exit For
End If
End If
Next
End Sub

Sub Get_Data()

With ActiveSheet.QueryTables.Add(Connection:=url, Destination:=Cells(lastrow, 2))
.Name = "t?s=998407.o&g=d"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "22"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With

Range("B5:F54").Select
Selection.Sort Key1:=Range("B5"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
End Sub

Calcマクロを実行すると、 
「実行時エラー"1004"ファイルにアクセスできませんでした。次のいずれかを行ってください。」 というエラーが出て止まってしまいます。

デバッグをすると、「Get_Dataマクロ」内の、
.Refresh BackgroundQuery:=False が黄色になります。

ステップインしても、やっぱり、
.Refresh BackgroundQuery:=False の所でエラーが出ます。(TT)

どうしても解決したい内容なので、
少しでも「解決の可能性」があれば、なんでも試してみたいと思っていますので、どうぞお気軽に回答お願いします。

力を貸しください。よろしくお願いします。

Webクエリを使って、「Yahooファイナンス」から日経平均株価の時系列データを取得したいのですが、うまくいきません。(TT)
下記に全コードを記載しますので、ご回答よろしくお願いします。

Dim url As String
Dim lastrow As Integer
Dim i As Integer

Sub Calc()
'価格データを取得するマクロ

'このマクロ内で用いる各変数を宣言
Dim code As String
Dim day_s As Integer, month_s As Integer, year_s As Integer
Dim day_e As Integer, month_e As Integer, year_e As Integer...続きを読む

Aベストアンサー

試したところ、ちゃんと動作しましたのでコードの問題ではないでしょう。

で、検索したところ同じような質問があり、
インターネット一時ファイル、履歴を削除したら解決したようです。
下記URLを覗いてみてください。

http://okwave.jp/qa2884378.html

外しましたらご容赦願います。
 

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な...続きを読む

QExcel ファイルに保存すると実行時エラーになる

こんにちは。宮本と申します。VB6(SP5)で、
プログラミングをしております。
下記の様にプログラミングをしましたが、どうしても
[実行時エラー’1004’ test_1.xlsにアクセスできません]と、なります。
c:\test.xls は、元々ある事を前提とし、c:\test_1.xlsに上書きをしたいのです。
宜しくお願い致します。

Dim wApp As Excel.Application
Dim wExl As Object

Set wApp = CreateObject("Excel.Application")

Set wApp = CreateObject("Excel.Application")
Set wExl = wApp.Workbooks.Open("c:\test.xls")

wExl.Worksheets(1).Cells(1, 1).Value = 3000

wExl.Application.Visible = False
wExl.Application.DisplayAlerts = False
wExl.SaveAs "c:\test_1.xls" <---ここで、エラー

こんにちは。宮本と申します。VB6(SP5)で、
プログラミングをしております。
下記の様にプログラミングをしましたが、どうしても
[実行時エラー’1004’ test_1.xlsにアクセスできません]と、なります。
c:\test.xls は、元々ある事を前提とし、c:\test_1.xlsに上書きをしたいのです。
宜しくお願い致します。

Dim wApp As Excel.Application
Dim wExl As Object

Set wApp = CreateObject("Excel.Application")

Set wApp = CreateObject("Excel.Application")
Set wExl = wApp.Workbooks....続きを読む

Aベストアンサー

Set wApp = Nothing
wExl.Close True

最後に追加すればOKだと思います。

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エクセルマクロでエラーの原因がわかりません。

 クエリーテーブルを使って、インターネットのサイトから情報をエクセルシートに書き込むエクセルマクロがあるのですが、急にエラーが生じることがあります。エラー内容は以下の通りです。

~~~~~~~~~~
 実行時エラー"1004"
  ファイルにアクセスできませんでした。次のいずれかを行ってみてください。
  ・指定したフォルダがあることを確認します。
  ・ファイルを含むフォルダが読み取り専用になっていないことを確認します。
  ・指定したファイルの名前にいずれかの文字も含まれていないことを確認します。<>?[]:
  ・ファイル名およびパス名が半角で、218文字より長くないことを確認します。

~~~~~~~~
 
 上記内容もよくわからず、エラーを生じず問題なく処理できることもあったりして、原因がよくわかりません。何かインターネットの接続上の問題なのでしょうか?また時間帯によってエラーになってりするのでしょうか??
 詳しい方、解決策を教えて下さい!!よろしくお願いします。

Aベストアンサー

数日前も同じような質問がありました。

下記が参考になるやも知れません。

http://oshiete1.goo.ne.jp/qa3501069.html

外しましたらご容赦願います。
 

 

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

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

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

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

Aベストアンサー

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

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


人気Q&Aランキング