アプリ版:「スタンプのみでお礼する」機能のリリースについて

Scripting Dictionary でvba 作成
同じデータの違うデータの参照はできますが、
違うファイルのデータを参照するにはどうしたら
いいのでしょぅか。
下記のコードは一部抜粋したものです。
恐らく上のあたりで違うデータの参照するとおもいますが、
わかる方いますでしょぅか

  Dim myDic As Object, myKey, myItem
  Dim myVal, myVal2, myVal3
  Dim i As Long, j As Long
  Dim sh1 As Worksheet
    Set myDic = CreateObject("Scripting.Dictionary")
    Set sh1 = Worksheets("Sheet1") ←--------------------この辺りをなおすとおもいますがわかりません
    ' ---元データを配列に格納
    myVal = sh1.Range("B3:D10").Value
    ' ---myDicへデータを格納
    For i = 1 To UBound(myVal, 1)
      myVal2 = myVal(i, 1) & "_" & myVal(i, 2)
      If Not myVal2 = "_" Then
        If Not myDic.exists(myVal2) Then
          myDic.Add myVal2, myVal(i, 3)
        Else
          myDic(myVal2) = myDic(myVal2) + myVal(i, 3)
        End If

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

  • どう思う?

    Dim var As Variant

    var = Workbook("ACTION SCRIPTING").Worksheets("売上")._
    Cells(1, 1).CurrentRegion.Value
    Worksheets(2).Cells(1, 1).Resize(UBound(var, 1), UBound(var, 2)).Value = var

    うまくいきません
    var = Workbook("ACTION SCRIPTING").Worksheets("売上")
    なんとかおしえてくれませんでしょぅか
    先ほどとは違うコードですがお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/03/27 18:08
  • どう思う?

    Sub j() 
    p = "C:\Scripting.Dictionary_1\"
    fn = "ACTION SCRIPTING.xls"
    Set wb = Workbooks.Open(p & fn)
    Set ws = wb.Worksheets("売上")
    v = ws.Cells(1, 1).CurrentRegion.Value
    Var = Worksheets(1).Cells(1, 1).CurrentRegion.Value
    ThisWorkbook.Worksheets(2).Cells(1, 1).Resize(UBound(Var, 1), UBound(Var, 2)).Value = Var
    Set wb = Nothing
    Set ws = Nothing
    wb.Close
    End Sub
    これでうまくいきましたがwb.close をつけるとエラーになります

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/03/27 20:23

A 回答 (4件)

横からですが、補足の部分に対してだけ。



>これでうまくいきましたがwb.close をつけるとエラーになります
そりゃそうでしょう

>Set wb = Nothing
>Set ws = Nothing
>wb.Close
Nothingを代入(=ブックオブジェクトは放棄)しといてから、closeメソッドを呼ぼうとしても、変数wbはすでにブックとは無関係になっているので、当然ながらエラーになります。
クローズしたければ、先に行うべき。
    • good
    • 0

No.2の補足に対して。



だって

Set wb = Nothing ← これ何しています?ここで変数はBookの事について解放されちゃってます。よって以降は知らん顔ですよ。
Set ws = Nothing
wb.Close

なので

wb.Close
Set wb = Nothing
Set ws = Nothing

この順番ではないでしょうか。
    • good
    • 0

・該当するブックが開いている事


・WorkBooks("Book名(拡張子を含む)")・・・と"s"が抜けてる
この回答への補足あり
    • good
    • 0

こんにちは



質問内容をよくわかってませんが、他ブックの内容をDictionary的に参照したいってことでしょうか?

対象のブックを開いて、データのあるシートから同じように抽出すれば良いだけです。
ご提示の例で言うなら、
変数sh1に 対象ブック.Worksheets("Sheet1")を代入するようにすれば、データを一括でmyValに取得しているので、その後はmyValを参照するようになっていると想像しますので(ご提示以外の部分は不明ですが)そのままですむものと思います。


とはいえ、もしも、ご質問のような利用頻度が高いのであるなら、毎回ご提示のような処理をしているのでは効率が悪いものと想像します。

2つのセルの値を合体したものをkeyにしていますが、例えば、シート内のどこかに作業列でkeyを計算(文字連結)させておけば良いですし、重複があるならそれも簡単に省けますので、作業列としてDictionary同様のkey:valueを作成しておくようにすれば、わざわざDictinaryを介さなくとも、LookUp等で直接参照できるようになります。

作業列が見えるのが嫌であれば、列を非表示しておくか、別シートに集計するようにして、そのシートそのものを非表示にしておけば済むことでしょう。

このような仕組みにしておけば、VBAから参照するにしても直接参照可能になりますし、処理の内容によってはVBAなどを用いずとも、シート内に関数式を設定しておけば事足りるような気もします。
この回答への補足あり
    • good
    • 0

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