【VBA】別ブックを参照する【Workbooks.Openもしくは数式を使う】

Поделиться
HTML-код
  • Опубликовано: 14 дек 2024

Комментарии • 20

  • @taichirox
    @taichirox 28 дней назад +1

    最後の配列に参照セルの数式を入れるのはすごくいい方法ですね。やってみたらとても速かったです。あと質問ですが、シートに書き出す前に値を取得して別の配列にすることはできますか?必要なものをDictionaryに取り込んでから書き出したいのですが。

  • @yukix151
    @yukix151 Год назад +3

    こんにちは 毎回仕事で使える内容で楽しく拝見しています。
    別ブックの値を参照する時に参照先のシート名がバラバラ(一番目のシートなのは共通)の場合はどうしたら良いのでしょうか?教えて頂けると嬉しいです。

    • @IT-gx8sf
      @IT-gx8sf  Год назад +1

      コメントありがとうございます!
      ファイル名がバラバラな場合は、「Dir関数」を使って、
      フォルダ内のすべてのファイル名を取得する方法を使うといいかと思います。
      本動画の最後のVBAコードで、「Dir関数」を使って、
      フォルダ内のすべてのファイルからデータを参照するVBAコードは、
      次のようになります。
      Sub TEST8()

      '配列を作成
      Dim Arr
      ReDim Arr(1 To 100, 1 To 3)

      Dim A, B, C, D
      A = ThisWorkbook.Path & "\TEST" 'フォルダパス
      C = "Sheet1" 'シート名

      'ファイル名を取得
      Dim FileName
      FileName = Dir(A & "\*")

      i = 0
      Do While FileName ""
      i = i + 1
      B = FileName '別ブック名
      '数式を配列に入力
      For j = 1 To 3
      D = Cells(1, j).Address 'セル範囲
      '数式を配列に格納
      Arr(i, j) = "='" & A & "\[" & B & "]" & C & " '!" & D
      Next
      FileName = Dir()
      Loop

      '配列をセルに入力
      Range("A1").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr
      '数式を値に変換
      Range("A1").CurrentRegion.Value = Range("A1").CurrentRegion.Value

      End Sub
      上記のように「Dir関数」を使うと、ファイル名がバラバラの場合でも、
      フォルダ内のファイルをすべて参照して、データを取得することができます。
      「Dir関数」を使う手順としては、次のような流れになります。
      ・最初にフォルダ内から1つのファイル名を取得
      ・Do While文を使って「Dir関数」をループ
      ・「Dir()」を、変数に入力することで次のファイル名を取得
      Dir関数を使って、フォルダ内のすべてのファイル名を取得する方法については、
      下記の動画にて解説しております。
      ruclips.net/video/_D5uRI9opB0/видео.html
      参考になればと思います(^^)

    • @yukix151
      @yukix151 Год назад +1

      @@IT-gx8sf 返信ありがとうございます。規則性のないファイルでも出来るのですね。この場合、シート名が違ってもエラーにならないのでしょうか?

    • @IT-gx8sf
      @IT-gx8sf  Год назад

      規則性のないファイルでも「Dir関数」を使えば、ファイル名を取得することができます。
      シート名が違う場合は、数式を使った「参照」する方法では、エラーとなってしまうかと思います。
      シート名がファイルごとに代わってしまう場合は、ちょっと遅くなってしまうんですけど、「Workbooks.Open」の方法を使うと取得することができます。

    • @yukix151
      @yukix151 Год назад

      @@IT-gx8sf ありがとうございます。別ブックの参照は仕事で必要なので大変参考になりました。これからも動画を楽しみにしています!

    • @yukix151
      @yukix151 Год назад +1

      @@IT-gx8sf ありがとうございます。別ブックの参照は仕事で必要なので大変参考になりました。これからも動画を楽しみにしています!

  • @kh250hajimen9
    @kh250hajimen9 Год назад +1

    初めまして。
    今回は有益な動画ありがとうございました。
    大変恐縮ですが、ご質問させてください
    別ブックを開いた時に、
    任意で取得したいシートを選択する方法は、ありますでしょうか?

    • @IT-gx8sf
      @IT-gx8sf  Год назад

      コメントありがとうございます!
      ブックを開いた方法ですと「Workbooks.Open」を使う方法になるかと思います。
      ブックを開いている状態で、任意のシートを選択する場合は、
      次のように入力することで、選択することができます。
      「Workbooks("ブック名").Worksheets("任意のシート名").Select」
      例えば、ブック名が「TEST1.xlsx」で、シート名が「Sheet2」の場合は、次のようになります。
      「Workbooks("TEST1.xlsx").Worksheets("Sheet2").Select」
      参考になればと思います(^^)

  • @hirorrro
    @hirorrro 6 месяцев назад +1

    こんにちは 数式だとnullが0で帰ってくる様に思うのですが、解決方法ご存じですか?

    • @IT-gx8sf
      @IT-gx8sf  6 месяцев назад +1

      コメントありがとうございます!
      取得データがnullの場合には「0」ではなく、「空欄」にしたい場合は、次のようにIF文を使うといいかと思います。
      =IF([TEST.xlsx]Sheet1!A1="","",[TEST.xlsx]Sheet1!A1)
      空欄の場合は空欄を入力して、それ以外の場合は値を取得するという感じです。
      参考になればと思います(^^)

    • @sm-su3gj
      @sm-su3gj 5 месяцев назад

      コメント失礼いたします🙇‍♀️
      このif関数は、VBAのどこに入力すればいいのでしょうか?
      初歩的なところで申し訳ないです。。

  • @mineto4682
    @mineto4682 2 года назад +1

    数式を使って、別ブックを参照する際にシートを選択するウィンドウが表示されてしまうのですが、
    これは設定で出力されないようにしているのでしょうか。
    それとも別の要因があるのでしょうか。。。

    • @IT-gx8sf
      @IT-gx8sf  2 года назад +1

      コメントありがとうございます!
      ファイル選択用のダイアログが表示される場合は、別ブックを参照する数式に誤りがあるかもしれません。
      数式に入力した参照先が見つからないので、ファイルを指定するダイアログが表示されているかと思います。
      入力した数式を確認して、ファイル名やシート名が正しいかを確認するとうまくいくかと思います。
      参考になればと思います。

    • @hs-vr4kq
      @hs-vr4kq 2 года назад +1

      @@IT-gx8sf 度々申し訳ありません。セルの列行幅を保持したまま参照することはできますか?自分なりに色々試しましたが出来ませんでした。素人で構文など理解できてないので、テンプレ頂けるとありがたいです。

    • @IT-gx8sf
      @IT-gx8sf  2 года назад

      コメントありがとうございます!
      別ブックを参照する方法では、列幅や行の高さを保持したまま参照することは難しいです(^^;)
      別ブックの値だけでなく、「列幅」まで取得したい場合は、「Workbooks」を使って別ブックを開いてから、別ブックの値を取得するといいです。
      例えば、「TEST2.xlsx」というファイルを作業しているマクロファイルと同じフォルダに保存して、「TEST2.xlsx」の列幅を変更しておきます。
      そして、次のVBAコードを実行すると、列幅も含めて値を取得することができます。
      Sub TEST1_2()
      '別ブックを開く
      Workbooks.Open Filename:=ThisWorkbook.Path & "\TEST2.xlsx"
      '別ブックの値をコピー
      ActiveWorkbook.Worksheets("Sheet1").Range("A1").CurrentRegion.Copy
      '「値」の貼り付け
      ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
      '「列幅」の貼り付け
      ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).PasteSpecial Paste:=xlPasteColumnWidths
      ActiveWorkbook.Close False '別ブックを閉じる
      End Sub
      手順としては、
      ・別ブックを開く
      ・別ブックの値をコピー状態にする
      ・別ブックの「値のみ」を作業しているブックに貼り付け
      ・別ブックの「列幅」を作業しているブックに貼り付け
      ・別ブックを閉じる
      という流れになります。
      さらに、行の高さについても取得したい場合は、「.RowHeight」を使って、行をループして取得します。
      別ブックには、3行分だけ値を入力していますので、3行分だけループして、行の高さを取得していきます。
      VBAコードは、次のようになります。
      Sub TEST1_2()
      '別ブックを開く
      Workbooks.Open Filename:=ThisWorkbook.Path & "\TEST2.xlsx"
      '別ブックの値をコピー
      ActiveWorkbook.Worksheets("Sheet1").Range("A1").CurrentRegion.Copy
      '「値」の貼り付け
      ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
      '「列幅」の貼り付け
      ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).PasteSpecial Paste:=xlPasteColumnWidths
      '行の高さを取得
      For i = 1 To 3
      ThisWorkbook.Worksheets("Sheet1").Rows(i).RowHeight = ActiveWorkbook.Worksheets("Sheet1").Rows(i).RowHeight
      Next
      ActiveWorkbook.Close False '別ブックを閉じる
      End Sub
      別ブックの値を取得する方法については、次の動画が参考になるかと思います。
      ↓別ブックの値を取得
      ruclips.net/video/LGbU78cc-NM/видео.html
      参考になればと思います(^^)

  • @もりもり-u2r
    @もりもり-u2r Год назад +4

    残念ながら業務では使えませんね
    100ファイルでも1行しかないのに127秒はかかり過ぎ
    業務では30ファイルで1ファイルが4万行以上あります
    そんなやり方が有ると言う知識は得られるが、ただ、それだけですね。
    参照の場合も20万行に関数を埋め込んで置いたら開くだけでも時間がかかると思いますね

    • @MarronMarron0718
      @MarronMarron0718 Год назад +5

      あなたは理解できるから否定のような言い方してると思うんですけど、わからない人のために丁寧に一個ずつ解説されてるじゃないですか
      例として
      東京から大阪に移動したいとなった時、いろいろな移動手段ありますよね
      徒歩、車、新幹線、飛行機 等
      人間の手作業のようなコードが徒歩ですよ
      時間かかりますけど、こんなコードもありますよという例えじゃないですか
      最終的にエクセルに搭載されている機能をフル活用すれば、飛行機で早く行けるように高速化できますよって紹介されてますよね
      徒歩のようなコードでもいいから、少しずつ車、新幹線、飛行機と高速化できるようになっていけばいいじゃないですか
      なぜ見下すような言い方なのか私には理解できません