AKB48の推しメンをセンターにできちゃうかもしれない!? >>

エクセルVBAで質問なのですが、別のブックを非表示で開いて処理をし、処理が終わったらそのブックを閉じるマクロを作りたいです。

ネットで方法をたくさん調べたのですが、うまくいきません。
ActiveWindow.Visible = Falseを使うと非表示でブックを開くのですが、次の処理をしようとすると非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。

どなたか良い方法をご存じないでしょうか?


↓今作ろうとしているマクロを参考に書いておきます。

ブックA内に書かれているブックBを非表示で開く

処理(ブックBのシート内の表に記入漏れの空白セルがあればブックAに空白セルの番地を表示させる)

ブックBを非表示のまま閉じる


非表示にせずにブックBを開けばうまく処理が完了するのですが、ActiveWindow.Visible = Falseを入れて非表示でブックBを開くと処理が開始しないという状況です。

質問者からの補足コメント

  • うれしい

    緊急で他の仕事が入ってしまい、このマクロを作る仕事をしばらく中断することになったので私のほうではまだ未解決ではあるのですが、今の仕事が終わってマクロを作る仕事が再開したらご回答してくださった方々が教えてくださった方法を試してみたいと思います。
    なので一度質問を締め切らせていただきますね。
    ご回答くださった方々にはとても感謝しております。ありがとうございました!

      補足日時:2016/06/23 13:42

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

VBA select」に関するQ&A: VBA Select Caseについて

A 回答 (4件)

こんにちは



>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いますが…)

Sub sample()
 Dim wb As Workbook, c As Range
 Dim str As String

 str = ""
 Set wb = Workbooks.Open(ThisWorkbook.Path & "\TestBook.xlsm")
 Windows(wb.Name).Visible = False

 For Each c In wb.Worksheets(1).Range("A1:C20")
  If c = Empty Then
   If str <> "" Then str = str & " , "
   str = str & c.Address
  End If
 Next c
 wb.Close SaveChanges:=False

 MsgBox str
End Sub

※ わざわざ『非表示』に設定しなくても、現在のウィンドウをアクティブにすることで、新しく開いたウィンドウを(裏側に)隠すこともできますね。
    • good
    • 6
この回答へのお礼

ご回答どうもありがとうございます。
非表示だとselectなどは使えないのですね。
非表示で開いたブック内の表の一部の範囲を選択して、その中から空白セルを探すように作っていたので、書き方を変えなければならないようですね。

わざわざ非表示にしなくても処理できているのだから私ももうこれでいいんじゃないかと思うのですが、上司が非表示にしてほしいと言うものですから^^;
私VBA初心者なのに次々とむずかしいことを要求してくるもので・・・

しばらくちょっと他の仕事をしなくてはならずマクロを作る仕事を中断してしまってfujillinが教えてくださった方法をすぐに試せないのですが、今度試してみます!ありがとうございます^^

お礼日時:2016/06/23 13:18

こんばんは


ブックやシートの選択の仕方を変えてみたらいかがでしょうか?

非表示のブックやそのシートは「select」や「Activate」は出来ません。しかし、
Workbooks("Book2").Worksheets("Sheet1").Range("A1") = 1
のような書き方ならば、非表示のブックやシートを扱えます。
    • good
    • 6
この回答へのお礼

ご回答ありがとうございます!

そのような書き方をすればいいのですね。
マクロの仕事をしばらく中断することになったのですぐに試せないのですが、今度試してみます!
知恵を貸していただきどうもありがとうございます!

お礼日時:2016/06/23 13:36

No.1 fujillinさんの云う通り、SelectやActivateなどを用いないように書き直せるのであれば、非表示にしなくてもあまり気にならないのですが、モスマンさんの書いているマクロは、表示がガチャガチャ動くようなタイプなのですか?もし、そうであれば、まずは、SelectやActivateなどを使わない書き方を学習すべきです。



とは言っても、手っ取り早く解決したいのであれば、画面の更新を抑止すれば、ご希望通りになると思います。
こんな感じです。

Application.ScreenUpdating = False ’画面更新の抑止
ブックのOPEN
処理
ブックClose
Application.ScreenUpdating = True ’画面更新の抑止解除
    • good
    • 4
この回答へのお礼

ご回答ありがとうございます。

他のブックを開いて一部の範囲を選択し、そこから空白セルを見つけたらそのセル番地を自動で記入していくという動きをさせてます。
非表示にしないで動かすとうまくいっていたのですが、非表示にすると動かなくなるものなんですね。
selectなどを使わないものに書き換えようと思っていたのですが、画面更新の抑止というものがあるのですか!
ちょっと試してみたいのですが他の仕事をしなくてはならずマクロを作る仕事をしばらく中断することになったのですぐに試せないのですが、他の閲覧者様たちの参考になるかもしれません。
今度マクロの仕事を再開したときに試してみたいです。
知恵を貸してくださりありがとうございました!

お礼日時:2016/06/23 13:34

>別のブックを非表示で開いて処理をし、処理が終わったらそのブックを閉じるマクロを作りたいです。



本当に非表示する必要があるのか、どこで邪魔になるのか、何か、誤解があるような気がしてなりません。半分/完全ステルスなら、Excelをオートメーション化して、稼働させます。以下は、何か別のことを思いついても、悪用はしないでください。
例えば、これにタイマーをつけて、完全なステルス化するとと、使用者は自覚がないままに、知らない間に、マクロが作業しています。
ADODBでも似たようなことはできるけれども、こちらの方が扱いが楽です。

'//
Sub StelthCehcking()
  Dim xlBook As Object
  Dim xlApp As Object
  Dim Rng As Range
  Dim blkRng As Range
  Dim buf As Variant
  Dim fn As String
  Dim bfn As String
  Dim c As Range
  Dim arBuf, i As Long
  On Error GoTo ErrHandler
  fn = "C:\Temp\BookB.xlsm" '目的のファイル
  bfn = Mid(fn, InStrRev(fn, "\") + 1)
  On Error Resume Next

' ブックを開いているかどうかを調べます
  Set xlBook = GetObject(bfn)
  If xlBook Is Nothing Then
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(fn)
  End If
  On Error GoTo 0
  
  With xlBook
    Set Rng = .Worksheets("Sheet2").Range("A1").CurrentRegion
    On Error Resume Next
    Set blkRng = Rng.SpecialCells(xlCellTypeBlanks) 'ブランクを探す
    On Error GoTo 0
    If Not blkRng Is Nothing Then
      For Each c In blkRng.Cells
        buf = buf & "," & c.Address(0, 0)
      Next c
    End If
    .Close False 'ブックを閉じる
  End With
  If Len(buf) > 1 Then
    arBuf = Split(Mid(buf, 2), ",")
    i = UBound(arBuf)
    'A列に書く
    ThisWorkbook.Worksheets("Sheet1").Range("A1").Resize(i + 1).Value _
    = WorksheetFunction.Transpose(arBuf)
  End If
ErrHandler:
  Set xlBook = Nothing
End Sub
    • good
    • 1
この回答へのお礼

ご回答どうもありがとうございます。

私もわざわざ非表示にする必要があるのか疑問なのですが、上司がそうしてほしいというのでそう作るしかなくて^^;
私VBA初心者なのであまり詳しくもないので、非表示にすることによって何か意味があるのかよくわからないんですが、作れるならなんとか作ろうと思いまして質問させていただきました。

しばらく他の仕事をせねばならずマクロの仕事を中断してしまっているのでWindFallerさんが教えてくださった方法をすぐに試せずまだ未解決なのですが、他の閲覧者様たちの参考になるかもしれません。私もマクロの仕事を再開するときに試してみます。知恵を貸してくださりありがとうございました!

お礼日時:2016/06/23 13:28

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

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

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

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

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

Qエクセルで別ブックをバックグラウンドでオープンする方法

最初にメニュー画面となるブックを開いた後、データブックをバックグランドのみで開きたいのですが、エクセルVBAで単純にOPENを行うと画面上にデータブックが表示されてしまいます。操作作業者に画面が次々入れ替わることを見せたくないのですが、ブックをバックグラウンドだけで開く方法はあるのでしょうか。VBAについては素人で宜しくお願いします。

Aベストアンサー

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
Public Bk3 As Workbook
Dim PathName As String

Sub Auto_Open()
PathName = ThisWorkbook.Sheets("メニュー").Range("C28").Value
ファイル読込 "初期値.xls", Bk1
ファイル読込 "データ1.xls", Bk2
ファイル読込 "データ2.xls", Bk3
End Sub

Sub ファイル読込(BkName, ObjBk)
Application.ScreenUpdating = False
Set ObjBk = Workbooks.Open(Filename:=PathName & "\" & BkName)
Windows(BkName).Visible = False
Application.ScreenUpdating = True
End Sub

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
P...続きを読む

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

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

Aベストアンサー

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

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

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
'-------------------------------------
 
 

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

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

QVBAでBook読み込み時の非表示方法は??

VBAでBook読み込み時の非表示方法は??

ExelのVBAでマクロを作成しています。
既存の*.exl ファイルを読み込むとき、
その内容を画面に表示しない方法があったら、
ご教示ください。

複数の既存の*.exl ファイルを連続して読み込み、
Books Objectに取得して、そのCell データを
集計しているのですが、読み込み完了と同時に
そのBookがActiveになって、画面に出現します。
この画面表示をぜずに、データ処理して
Closeし、次々に処理を進めたいと思っています。
よろしくお願いいたします。

Aベストアンサー

Application.ScreenUpdating = False
'処理
Application.ScreenUpdating = True
とすれば、画面の更新は行いません。


Application.WindowState = xlMinimized
で、最小化

http://www.happy2-island.com/excelsmile/smile03/capter00806.shtml


Application.Visible = False
とすると、エクセルの表示その物が消えます。
エラーが合った場合やその後の事はどうなるか試していませんが。

http://www.ken3.org/vba/backno/vba125.html

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

QEXCEL VBAからEXCELファイルを非表示で開きたい

こんにちは。
EXCEL VBAから、別のEXCELのファイルを非表示で参照し、
セルの内容を取得したいのですが、やり方がわかりません。

どなたかお知恵をお貸しください。
できれば、具体的な記述方法を知りたいです。

Aベストアンサー

○別のBookを開いて参照する例です。最後は閉じています。開いた状態は見えないはずです。
 標準モジュールに貼りつけます。(当方、Excel97です)

○これとは別に、別のBookを開いた状態で、算式で参照しておけば開く必要はありません。
 特定のセルを参照するならこちらのほうが簡単です。


Sub SansyoBook()
  Dim xlsFilePath As String '別のExcelBookのパス
  Dim xlsFileName As String '別のExcelBookのファイル名
  Dim myBk As String '呼び出すBook名
  Dim otBk As String '別のBook名

  myBk = ThisWorkbook.Name

  Application.ScreenUpdating = False

    ActiveCell.Activate

    '///// パスとファイル名をセットする /////
    xlsFilePath = "C:\・・・・\・・・・\"  '自分でセットします
    xlsFileName = "別ブックBook1.xls"    '自分でセットします

    '///// 別Bookを開く /////
    Workbooks.Open xlsFilePath & xlsFileName
      otBk = ActiveWorkbook.Name

    '///// 元のBookのほうから別Bookのセルを参照 /////
    Workbooks(myBk).Activate
      With Workbooks(otBk).Worksheets("Sheet1")
        Range("A1") = .Range("A1") 'セルA1を参照する
        Range("A2") = .Range("B2") 'セルB2を参照する
      End With

    '///// 別Bookを閉じる /////
    Workbooks(otBk).Activate
    Workbooks(otBk).Close

    Workbooks(myBk).Activate

  Application.ScreenUpdating = True
End Sub

○別のBookを開いて参照する例です。最後は閉じています。開いた状態は見えないはずです。
 標準モジュールに貼りつけます。(当方、Excel97です)

○これとは別に、別のBookを開いた状態で、算式で参照しておけば開く必要はありません。
 特定のセルを参照するならこちらのほうが簡単です。


Sub SansyoBook()
  Dim xlsFilePath As String '別のExcelBookのパス
  Dim xlsFileName As String '別のExcelBookのファイル名
  Dim myBk As String '呼び出すBook名
  Dim otBk A...続きを読む

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

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

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

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

Aベストアンサー

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

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

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。


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

人気Q&Aランキング