現在下記のようなコードでテストしています。

Sub Sample()

Dim TargetBook As Workbook

   Set TargetBook = Workbooks.Open("Book2.xls")
   TargetBook.Sheets("Sheet1").Cells(1, 5) = Cells(1, 1)
   TargetBook.Close

End Sub

Book2を開いてセルの読み書きはテストできました。
これをBook2をopenせず閉じた状態で操作したいと思っています。
Workbooksの表示されるメソッドを色々試してみますが出来ません。
OpenDatabaseが使用できるのかと思いますが、出来ません。
ご指導よろしくお願いします。

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

A 回答 (4件)

Sub Sample2()


Dim myPath As String
Dim fn As String
  myPath = Application.DefaultFilePath 'パス
  fn = "Book2.xls" 'ファイル名
  'R1C1型で書く
  ret = Application.ExecuteExcel4Macro("'" & myPath & "[" & fn & "]Sheet1'!R1C1")
  ThisWorkbook.Sheets("Sheet1").Cells(1, 5) = ret
End Sub

他にも、
>OpenDatabaseが使用できる
ODBC(Open Database Connectivity)という意味でしたら、[外部データの取り込み]から操作します。ただし、その使用する列全体を使用してしまいますので、取り込みには、その以下にデータを置くことは出来ない欠点があります。

Office をインストールしていれば、Jet はインストールしていますから、当然、ADODBなどは利用できますが、意外に面倒かもしれません。フィールドがなくても取得できます。

この回答への補足

bookを閉じた状態で読み込みする事が出来ました。
逆に書き込みを行うとした時にエラー424 オブジェクトが必要ですと出ます。
このメソッドで書き込みは出来ないのでしょうか?
Application.ExecuteExcel4Macro("'" & myPath & "[" & fn & "]Sheet1'!R1C1") = "test"

補足日時:2011/01/07 08:14
    • good
    • 5

#3の追伸です。



ここをご覧になってください。

http://support.microsoft.com/kb/278973/ja
ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)

サンプルファイル(ExcelADO.exe)もおいてあります。
    • good
    • 1

>逆に書き込みを行うとした時にエラー424 オブジェクトが必要ですと出ます。


>このメソッドで書き込みは出来ないのでしょうか?

ExecuteExcel4Macro(一般数式) Index 関数の利用も可能です。配列自体は取り出せませんが、配列からひとつの解を求めることは可能です。

これは読み出し専用です。書き込みするには、#2さんの方法や、ADODBやDAOを使いますが、ADODBをキーワードにして、Web検索をすればヒットするかとは思います。しかし、私自身、数年に1度書くかしないか程度で、実務的ではないし、しいてやれないことはない、という程度です。あまり、掲示板で披露した記憶がありません。

また、ADODBは、Excelの場合は、内部オブジェクトが備わっていないので、インスタンスを生成してから、値取得の段階に入っていきます。したがって、その時オーバーヘッドが掛かり、あまり思ったほどの効果はありません。

私からのアドバイスとしては、標準的な、ファイルを開いて、閉じる方法で良いのではないかと思います。

特に、#2さんの
Application.ScreenUpdating = False
 値-取得・値-書込
Application.ScreenUpdating = True
で、画面の変更のロスが減りますので、その分、時間が短縮できます。

私自身では、ADODB等で取得する場合は、データベースファイルに限ります。やはり、ファイルをOpenメソッドで開けて、それで書きこんで、保存するというオーソドックスな方法を使います。作成中に、目視して確認出来るという利点もあります。

なお、変則的には、私は、CreateObject("Excel.Application") というオートメーション化して使う場合があります。他の開いているブックに影響を受けないのと、マクロセキュリティに影響を受けない利点があります。しかし、これは、気を付けないと、メモリに残してしまうというミスを起こすことがあります。もうひとつは、絶対的とは言いませんが、.Value プロパティの省略などは、しないように注意しなければなりません。
    • good
    • 0

開かないで操作する方法は存じませんが、開いたことを気づかせずに操作するなら以下でどうでしょう?



マクロを書いたBOOKのアクティブなシートのA1セルの値を転記するなら

Sub Sample01()
  Dim TargetBook As Workbook
  Dim ws As Worksheet
  Set TargetBook = Workbooks.Open("Book2.xls")
  Set ws = ThisWorkbook.ActiveSheet
  With Application
    .ScreenUpdating = False
    TargetBook.Sheets("Sheet1").Cells(1, 5) = ws.Cells(1, 1)
    TargetBook.Close (True)
    .ScreenUpdating = True
  End With
End Sub

そうではなく、BOOK2のシート1のA1セルの値を転記するなら

Sub Sample02()
  Dim TargetBook As Workbook
  Set TargetBook = Workbooks.Open("Book2.xls")
  Application.ScreenUpdating = False
  With TargetBook
    .Sheets("Sheet1").Cells(1, 5) = .Sheets("Sheet1").Cells(1, 1)
    .Close (True)
  End With
  Application.ScreenUpdating = True
End Sub
    • good
    • 0

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

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

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

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

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

QWorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】

よろしくお願いします。
今あるブックにあるシートを別のブックにコピーしたいのですが、今考えているのは

ここから////////
'ブックを開く
Workbooks.Open コピー元のブックのパス
'シートをコピー
Worksheets.Item(コピーするシート名).Copy _
after:=Workbooks(コピー先のブック名).Sheets(1)

'ブックを閉じる
Application.DisplayAlerts = False
Workbooks.Item(コピー元のブック名)Close True
Application.DisplayAlerts = True
ここまで////

なのですが、コピーものとのブックが複数ある時、画面がチラチラしてしまいます。ブックをオープンさせずにシートを他ブックにコピーさせる方法ってないでしょうか。
ご存知の方がいらっしゃいましたら、ご教授お願いします。

Aベストアンサー

画面のチラツキを押さえたいだけなら、画面の更新をやめればいいだけじゃないでしょうか?

ブックを開く前に
Application.ScreenUpdating = False
ブック閉じてから
Application.ScreenUpdating = True

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

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

Q参照先のブックを開かずに内容をコピーしたい

エクセルのマクロ初心者です。
いつもここで他の方のQ&Aを参考にしたり、自分で質問したりしてお世話になっています。

今回は、参照先のブックを開かずにその内容をコピーする方法についてお聞きしたいです。
現在、下記のようなマクロを組んでいます。

Workbooks.Open FileName:="BookA.xls"
Sheets("Sheet1").Activate
Range("B4:H4").Copy
Windows("BookB.xls").Activate
Sheets("Sheet2").Select
Range("B1").Select
Sheets("Sheet2").Paste
Workbooks("BookA").Close
Windows("BookB").Activate

つまり、BookAのセルの一部分をコピーしてBookBのセルに貼り付けるという内容なんですが、コピー参照先のBookAを一度開いてコピーしてからBookBに行って貼付け、さらにBookAを閉じた後でBookBに再び戻る、という動作になっているため、画面がパラパラと切り替わる時間があって少々うっとおしいのです。
BookAをいちいち開かずに内容をコピーする方法があると思うのですが、どのような構文を使えばいいでしょうか?
ご回答よろしくお願いします。

エクセルのマクロ初心者です。
いつもここで他の方のQ&Aを参考にしたり、自分で質問したりしてお世話になっています。

今回は、参照先のブックを開かずにその内容をコピーする方法についてお聞きしたいです。
現在、下記のようなマクロを組んでいます。

Workbooks.Open FileName:="BookA.xls"
Sheets("Sheet1").Activate
Range("B4:H4").Copy
Windows("BookB.xls").Activate
Sheets("Sheet2").Select
Range("B1").Select
Sheets("Sheet2").Paste
Workbooks("BookA").C...続きを読む

Aベストアンサー

>画面がパラパラと切り替わる時間があって少々うっとおしいのです。
これだけならマクロの最初と最期で
Application.ScreenUpdating = False
処理
Application.ScreenUpdating = True
とすればいいのでは?

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

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

Aベストアンサー

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

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

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別のシートから値を取得するとき

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

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

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

Aベストアンサー

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

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

Qエクセルで開いていないbookのセルの値が欲しい

エクセルが少し使える程度です。
1000個のブック内に同じ名前のシートが1個づつできています。
その1000個のシート毎にK列の最大値を求めたいのですが、
1000個のシートを”全て開くことなしに”できないでしょうか?

シート名は整理表から求めることができます。
シート名="C9&"\"&D9&"\["&A9&".xls]sheet1'"

シートが開いていれば、以下で求めることができるのですが。
=max(シート名!$k$2:$k$1250)

Aベストアンサー

ご質問の内容を取り違えていましたらすみません。
状況・課題の確認も兼ねて冗長な説明になるかと思いますがご容赦ください。

まず、開いているブックへの参照は
A:=max([Sample.xls]Sheet1!$k$2:$k$1250)
といった形になりますよね。

ここでリンク元のブックを閉じると、
数式は自動的に
B:=max('D:\***\[Sample.xls]Sheet1'!$k$2:$k$1250)
といった形に変わります。

この状態であれば、閉じたブックの値を参照することができます。
また、Bの形の数式を直接入力した場合でも
閉じたブックの値を参照できます。

問題は、対象のブックが大量にある場合に
Bの形の数式を順次入力していくのは現実的でない
ということだろうと思います。

対象ブックが開いている場合には、indirectを使用して
C:=max(INDIRECT("'"&A1&":\"&B1&"\["&C1&".xls]Sheet1'!$k$2:$k$1250"))
とすれば参照を動的に生成することができますが、
indirectでは閉じたブックを参照することはできません。

で、ようやく対策ですが、
Bの形の数式自体を文字列として生成し、
D:="=max('"&A1&":\"&B1&"\["&C1&".xls]Sheet1'!$k$2:$k$1250)"
メモ帳等を経由して貼り付けることで、
イの形の数式を一気に入力することができます。
(エクセルからエクセルへ直接の値貼り付けや数式貼り付けでは不可)

ただし、対象のブックが動いた場合には
その都度参照を貼りなおす必要がありますので、
対象のブックが頻繁に動くような場合には、
マクロを利用するほかはなかろうと思います。
1.#1さんの方法で直接参照する。
2.「整理表」の変更をイベントで取得して参照数式を書き換える。
3.リンク元ブックをバックグラウンドで開いてしまう(!)
といったアプローチが考えられます。

ご質問の内容を取り違えていましたらすみません。
状況・課題の確認も兼ねて冗長な説明になるかと思いますがご容赦ください。

まず、開いているブックへの参照は
A:=max([Sample.xls]Sheet1!$k$2:$k$1250)
といった形になりますよね。

ここでリンク元のブックを閉じると、
数式は自動的に
B:=max('D:\***\[Sample.xls]Sheet1'!$k$2:$k$1250)
といった形に変わります。

この状態であれば、閉じたブックの値を参照することができます。
また、Bの形の数式を直接入力した場合でも
閉じたブッ...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub


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

人気Q&Aランキング

おすすめ情報