質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • VBA

    1802questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1539questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

別ファイルのセル 操作

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,038

eragonasable

score 7

別ファイルのセルの操作ができず、困っています。

ファイルAからファイルBを開き、ファイルBを閉じるときに、ファイルAに値を反映させて、ファイルBを閉じる処理を行いたいと思っており、
反映させる処理は完成したのですが、最後にファイルAのあるシートのA1セルを選択させた状態にしたいと考えています。

ただ、最後の処理でファイルAのあるシートのA1をselectメソッドで指定すると、

「実行時エラー '1004': Range クラスの Select メソッドが失敗しました。」

がでます。

  Set wb = Workbooks(ファイルA)
  
  ~反映処理~

  wb.Activate   
    wb.Sheets(MENU).Activate
   wb.Sheets(MENU).Range("A1").Select

上記の一番最後のところでエラーが出ます。
ちなみに最後を
SelcetではなくValueにし,中身を確認すると確かにA1セルの値が入っていることは確認できています。

どなたかご教授お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

そのエラーはSheetがアクティブになっていないと出るので、
実際のコードでアクティブになっているかどうか確認してみて下さい。
SelectをValueに変えると値が取得出来るというのはたまたまその時点でアクティブになっているシートの値が
ファイルAのMENUシートのRange("A1")と同一の値だったという事はありませんか。

また、提示されたコードですがActivateしたオブジェクトを繰り返し指定する必要はありません。
加えて、ファイル名やシート名を囲む"が無いと、オブジェクト名や変数名と混同しますので、
省略されない方が良いと思います。
「ファイルA」や「MENU」が変数でないのならば、提示されたコードは書き方が間違っているという事になりますので。

wb.activate
Sheets("MENU").Activate
Range("A1").select

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/13 09:37

    >ファイルAのMENUシートのRange("A1")と同一の値だったという事はありませんか。
    ファイルAにしかないシートかつ値を入れているので、間違いないと思います。

    >また、提示されたコードですがActivateしたオブジェクトを繰り返し指定する必要はありません。
    >加えて、ファイル名やシート名を囲む"が無いと、オブジェクト名や変数名と混同しますので、
    >省略されない方が良いと思います。
    気を付けます。ご指摘ありがとうございます。

    シートがActiveになっているかどうか含めて、再調査を行ってみます。ありがとうございます。

    キャンセル

+1

おそらく、オブジェクトの指定と、使用するオブジェクトが違うような気がします。
エクセルでは、アクティブになっていなくても、オブジェクトを正しく指定することによって、対処できます。

Application.Workbook("ファイル.xlsx").Worksheets("シート名").Range("A1").Select

Sheetsオブジェクトより、Worksheetsオブジェクトを使用することをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 22:03

    試してみましたが、やはり反応はしませんでした。
    ただ、おっしゃる通り、しっかりとオブジェクトを指定していくということは大切な気がします。
    反映のところもしっかりと見直したい思います。
    やはり、一度しっかりと概念を勉強した方がいいのだろうな

    キャンセル

checkベストアンサー

0

VBAは、「Option Explicit」を記載しなければ型宣言すらしなくても動いてしまう緩い言語です。
そのため、質問者様のように、オブジェクトの指定や設定があいまいであってもVBAが理解して動いてくれることが多いのですが、kai_keitai 様がおっしゃるようにオブジェクトの正しい指定をしないと予期しないところでバグが生まれます。
そこで、質問者様のコードを堅牢に書いてみましたので、コード全体をこれに習って修正されてみてはいかがでしょうか。
VBAはEXCELを操作する上で一番親和性が高い言語であり、今後も使用するでしょうし、堅牢に書けるようになっておいて損はないと思います。
※下記コードはメソッド分割をしていませんので、メソッド分割は適宜実施して下さい。

' 型宣言を強制する(バグ防止のため)
Option Explicit

' 今回記載されている処理を実施するプロシージャ
Public Sub main()

    ' 変数宣言
    Dim bookB As Workbook
    Dim bookBPath As String

    With Application
        ' 画面描画をオフにする
        .ScreenUpdating = False
        ' ブックを開く際のアラートを表示しない
        .DisplayAlerts = False
    End With

    ' ブックBのパスを入力
    bookBPath = InputBox("ブックBのパスを指定してください")

    ' ブックBのパスが入力されなかった場合は処理終了
    If bookBPath = "" Then
        MsgBox "Bブックのパスが入力されなかったので処理を終了します", vbExclamation + vbOKOnly, "処理中断"
        Exit Sub
    End If

    ' エラー制御開始
    On Error Resume Next

    ' ブックBを開く(読み取り専用)
    Set bookB = Workbooks.Open(bookBPath, 0, True, , , , True)

    ' ブックBを開くのが失敗した場合は処理終了
    If Err.Number <> 0 Then
        MsgBox "Bブックを開けなかったため処理を終了します", vbExclamation + vbOKOnly, "処理中断"
        Exit Sub
    End If

    ' エラー制御終了
    On Error GoTo 0

    ' ブックBのセルの内容をブックAにコピー
    ' ここでは例としてBブックの1シート目のA1セルの値をブックA(=このブック)の1シート目のA1セルにペースト
    With bookB.Worksheets(1)
        ThisWorkbook.Worksheets(1).Range("A1") = .Range("A1")
    End With

    ' ブックBを閉じる(保存しない)
    bookB.Close False

    ' ブックAの1シート目のA1セルを選択する
    ThisWorkbook.Worksheets(1).Range("A1").Select

    With Application
        ' 画面描画を再開する
        .ScreenUpdating = False
        ' ブックを開く際のアラートを表示する
        .DisplayAlerts = False
    End With

    ' 処理完了をユーザーに通知
    MsgBox "Bブックからのコピーが完了しました", vbInformation + vbOKOnly, "処理完了"

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 22:09

    同じ処理内容なのにここまで変わるものなのですね、驚きました。
    こちらを参考に試してみたいと思います。
    VBA自体ちゃんと習ったり勉強して書いていたわけではなく、唐突にやれと言われて他人が書いたコードをなんとか読み解けているからいいかなと思っていましたが、おっしゃる通り今後も使う可能性は高いと思うので、堅牢な書き方なども意識し書けるようにしていきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1802questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1539questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。