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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

Q&A

2回答

7102閲覧

別ファイルのデータを配列に入れたい

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

0グッド

0クリップ

投稿2021/06/02 07:44

編集2021/06/02 08:20

結論から申し上げますと
あるExcelファイル(Aファイルとする)から別Excelファイル(Bファイルとする)を開いたものの、
その開いたBファイルの中のデータを拾って演算し、Aファイルに吐き出すという事ができずにいます。
どの様にすべきか、またどんな部品を使うべきか、ご教授下さい。

使用言語はVBA,OSはWindows10です。

実現したい内容が以下です。
1:Aファイルにあるボタンを押下
2:Bファイルにあるデータを取得
3:そのデータの中で、重複データのみを合計したものと、重複していないデータを
Aファイルにあるボタンを押下したsheetに出力。
この際、重複しているデータは削除する。

現在は以下まで、進んでおります。
切り分けとして、まず、
・VBAによるファイル読み込みのプログラムを深く理解していない可能性
・Rangeによる指定に実は幅があり、どこのディレクトリのどのファイルのどのシートのRangeか。という様に指定できる可能性
というアプローチで調べながら作ってます。

以下が、実際にプログラムを作った内容です。(当然ながら、未完成です)

Sub 重複データを削除し合計を合算()

Dim myDic As Object
Dim myKey As Variant
Dim myItem As Variant
Dim myList As Variant
Dim i As Long

Dim sPath
Dim wb As Workbook
Dim ex As New Excel.Application

'//ファイル指定 sPath = "C:\webb\Total.xlsx" '//指定ファイルを開く Set wb = ex.Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) Set myDic = CreateObject("Scripting.Dictionary") 'A列,B列のデータを配列に格納 myList = Range("A2", Range("A" & Rows.Count). _ End(xlUp)).Resize(, 2).Value '連想配列にデータを格納 For i = 1 To UBound(myList, 1) '地域名が空欄かチェック If Not myList(i, 1) = Empty Then If Not myDic.exists(myList(i, 1)) Then '重複しない地域名を取得 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) Else '売上金額を加算 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) End If End If Next '[都道府県] 重複していないリストを格納 myKey = myDic.keys '[売上] 各都道府県の合計を格納 myItem = myDic.items 'リストを出力 For i = 0 To UBound(myKey) Cells(i + 2, 5).Value = myKey(i) Cells(i + 2, 6).Value = myItem(i) Next '開放 Set myDic = Nothing

End Sub

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例えばですが、

VBA

1Dim oSheetA As Object 2Dim oSheetB As Object 3 4Set oSheetA = ThisWorkbook.Sheets("Aのシート名") 5Set oSheetB = wb.Sheets("Bのシート名")

というふうにして、AファイルのほうのRangeは「oSheetA.Range(...」、
Bのほうは「oSheetB.Range(...」とすれば分かりやすいと思います。
ThisWorkbookというのは、マクロが入っているブックです。
上記のように明示してあげれば、Bが別インスタンスでもそうでなくても
どちらでも良いと思います。

投稿2021/06/02 08:42

plomte

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/03 06:10

なるほど。 ありがとうございます。 早速試させて頂きます。
guest

0

ex が別インスタンスになっていることに起因しているような気がするのと、
RangeやCellsを無印で使うのも間違いのもとになっているように思える。

VBA

1'//指定ファイルを開く 2Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) 3 4'A列,B列のデータを配列に格納 5Dim ws As Worksheet 6Set ws = wb.Worksheets(1) 7myList = ws.Range("A2", ws.Range("A" & ws.Rows.Count).End(xlUp)).Resize(, 2).Value 8 9'リストを出力 10Dim outSheet As Worksheet 11Set outSheet = Thisworkbook.Worksheets(1) 12For i = 0 To UBound(myKey) 13outSheet.Cells(i + 2, 5).Value = myKey(i) 14outSheet.Cells(i + 2, 6).Value = myItem(i) 15Next 16

VBA

1Dim sPath 2sPath = "C:\webb\Total.xlsx" 3 4Dim wb As Workbook 5Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) 6 7Dim ws As Worksheet 8Set ws = wb.Worksheets(1) 9 10Dim myList As Variant 11myList = ws.Range("A2", ws.Range("A" & ws.Rows.Count).End(xlUp)).Resize(, 2).Value 12wb.Close SaveChanges:=False 13 14Dim myDic 'As Scripting.Dictionary 15Set myDic = CreateObject("Scripting.Dictionary") 16 17Dim i As Long 18For i = 1 To UBound(myList, 1) 19 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) 20Next 21If myDic.Exists(Empty) Then myDic.Remove Empty 22 23ws.Range("E2").Resize(myDic.Count, 2).Value = WorksheetFunction.Transpose(Array(myDic.Keys, myDic.Items)) 24

投稿2021/06/02 08:04

編集2021/06/02 12:13
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/02 08:21

上記プログラムだと 'リストを出力 の段階でBファイルに吐き出してしまい、 Aファイルに吐き出せないような気がします。 (ご教授ありがとうございます。文頭が若干誤っておりましたので修正しました)
jinoji

2021/06/02 08:45

私が読んだ時にはBファイルに出力すると書いてあったのでそうしたのですが、 Aファイルに出力するようにもできると思います。(コードをそのように修正しました。)
退会済みユーザー

退会済みユーザー

2021/06/03 06:10

ありがとうございます。 早速試させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問