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

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

ただいまの
回答率

88.04%

他ブック読込時にActivateが効かない

解決済

回答 2

投稿

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

score 12

開発環境:Excel 2013

他ブックから、複数シートのデータを取り込むマクロを作成しております。

    Dim wbRead As Workbook                      'ワークブック(読込)
    Dim wbMe As Workbook                        'ワークブック (自分)
    dim varList as Variant
    dim i as integer

    Set wbMe = ThisWorkbook 
    Set wbRead = Workbooks.Open(ファイル名)

    For i = 1 to シート数
       With wbRead.Sheets(シート名(i))
           .Activate

           'データ取込処理
           .cells(1,1).CurrentRegion.select
           Selection.Offset(1, 0).Select
           Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count).Select
           varData = Selection
       End With

    wbMe.Activate
       With wbMe.Sheets(シート名(i))
           .Activate

           'データ書き込み処理
           .cells(1,1).CurrentRegion.select
           Selection.Offset(1, 0).Select
           Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count).Select
           Selection = varData
       End With
    Next i

  wbRead.Close SaveChanges:=False


このような処理を組んでいます。
(実際の読込処理、書込処理では取込データの加工や、書き込み位置の計算処理なども行っています)

対象シートをActivateの後に表からデータ部を配列化していますが、
データ書き込み処理でのActivateが動作されず、
書き込み処理が正常に行われません。

ただし、.Activateの箇所でブレイクポイントを貼って
デバッグで動作させる場合は、正常に動作します。
(.Activateでステップを進めると、
自ブックの対象シートが画面最善面に表示されます)
また、.Activate以外の箇所にブレイクポイントを張ると、
必ず読込ブックが最前面に居る状態でブレイクされます。

このような現象の際の対処法について、
御教授いただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

アクティブ前提の作りはやめましょう。
環境に左右されやすく安定した動作は望めません。
ワークシートはオブジェクト変数に代入しておくことで操作が可能です。

Dim ws As Worksheet
Set ws = wbMe.Sheets(1)
ws.cells(1,1).CurrentRegion.select

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/25 17:33

    ご回答ありがとうございます!
    Activateとはそういうものなのですね…。
    不勉強でした。
    いつも御助言いただき、ありがとうございます。

    キャンセル

+1

解決済みですが、あえて補足を。

Activateは避けるべきですが、同様の理由でSelectも避けるべきです。
どちらも大抵の場合なくても処理できます。
その方が安定、高速、シンプルです。

それぞれのオブジェクトを変数に代入してそれに対して操作するようにします。
また Withステートメントをうまく使うと、変数なしにオブジェクトを直接操作できるので、シンプルかつ読みやすいコードになります。

    Dim wbMe As Workbook                        'ワークブック (自分)
    Set wbMe = ThisWorkbook
    Dim wbRead As Workbook                      'ワークブック(読込)
    Set wbRead = Workbooks.Open(ファイル名)

    Dim i As Integer, varData As Variant
    For i = 1 To シート数
        With wbRead.Sheets(シート名(i)).Cells(1, 1).CurrentRegion
        'データ取込処理
            varData = .Offset(1, 0).Resize(.Rows.Count - 1).Value
        End With

       'データ書き込み処理
        wbMe.Sheets(シート名(i)).Cells(2, 1) _
            .Resize(UBound(varData, 1), UBound(varData, 2)).Value = varData
    Next i

    wbRead.Close SaveChanges:=False

ちなみに書き込み処理は配列のサイズでセル範囲をResizeしないとだめです。
また、私は変数はなるべく使う直前で宣言する派です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/26 16:41

    いま、まさにSelectでの動作不具合が出ていました。
    ご提示頂いたプログラムコードを参考に解決しました。
    ありがとうございます!

    CurrentRegionをWithステートメントで纏めるという考えが
    全く無かったので、とても勉強になりました。

    キャンセル

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

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

関連した質問

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