プロが教える店舗&オフィスのセキュリティ対策術

ステップイン(F8)で実行するとうまくいくのに、通常実行するとエラー等はでませんが、数字を取ってくることができません。
どのように改善すると通常実行でも期待通りの結果が得られるのでしょうか。よろしくお願いします。

変数に5桁のAcc_ID(12345)を代入し、外部データX.xlsxの特定のシート内に該当するIDがあれば、次の列にある毎月の入金額をthisworkbookに入力するマクロを作っています。(宣言するところは省略します)

外部データX.xlsxはこのようなレイアウトになっています。
123451月2月3月
入金額100200300


Acc_ID = 12345

With Workbooks("外部データX.xlsx").Worksheets("入金").Columns(4)

Set X_Acc_ID = .Find(Acc_ID)

If X_Acc_ID Is Nothing Then

Else

    '列番号を取得 
  R_X_Acc = .Cells.Find(Acc_ID).End(xlDown).Row

Dim m As Integer
For m = 0 To 11 '---12か月

ThisWorkbook.Worksheets(MySheet).Cells(20, 9 + m ) = .Cells(R_X_Acc + 1, 1 + m)

Next m

End If

End With

A 回答 (1件)

こんにちは



>該当するIDがあれば、次の列にある毎月の入金額をthisworkbookに入力する
         :
>外部データX.xlsxはこのようなレイアウトになっています。
>123451月2月3月
>入金額100200300

データの持ち方ですが、4列目(D列)にIDコードを記入していて、
金額はIDコードの1行下のE列から記入されているということでしょうか?
            ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 D  E  F  G
12345 1月 2月 3月
    100  200  300

データのレイアウトを見る限り、そう解釈できるのですが・・
このあたりは、VBAの解釈について影響を与えるので正確に説明しましょう。

その前提で回答します。

1)R_X_Acc = .Cells.Find(Acc_ID).End(xlDown).Row

 の.End(xlDown)はいりません。
 連続したデータの最終行を取得するためのコードです。 あと、.Cellsはいらないのでは
 ないでしょうか? 検索結果の位置を取得するためには

  R_X_Acc = .Find(Acc_ID).Row

 でよいと思います。

2)For ~ nextの中にある

 ThisWorkbook.Worksheets(MySheet).Cells(20, 9 + m) = .Cells(R_X_Acc + 1, 1 + m)

 この文ですが、1)に関連していますが、.Cells(R_X_Acc + 1, 1 + m)
 つまり、R_X_Acc + 1は、 1)で取得した行+1行目を指定していますね。
 ※検索値が該当した行+1行目

 データが取得できていないのは、このR_X_Accを取得する際に、.End(xlDown)を使っているために
 正しい位置を取得できていないことが原因ではないでしょうか?

 また、1 + m とありますが、Withで、

  With Workbooks("外部データX.xlsx").Worksheets("入金").Columns(4)

 と指定していますので 
  Workbooks("外部データX.xlsx").Worksheets("入金").Columns(4) _
      .Cells(R_X_Acc + 1, 1 + m)

 となります。 

 .Columns(4).Cells(R_X_Acc + 1, 1 + m)という使い方はしたことはありませんが、
 Columns(4)を受けて、後ろのCells(x,y)のyは、1がD列となり、2はE列、3はF列と
 なるようですね。

 従って、上記はD列 + mとなります。(m = 0~11)
 金額をE列から置いているなら

 ThisWorkbook.Worksheets(MySheet).Cells(20, 9 + m) = .Cells(R_X_Acc + 1, 2 + m)

 とします。


それから、宣言の記載等を省略していますが、このような質問をするときは、きちんと載せて
おきましょう。 そこに問題があるかもしれませんので・・


また、スキップ動作(F8)では上手く動いたというのは、よくわかりません。
普通にやれば、問題なく結果がでると思いますが・・

スキップでやった時にも、きちんと結果はでていましたか?
エラーが出なくても、論理的なエラーもありますので、結果を確認してください。

以下、私のほうで動いた内容を記載しておきます。


<以下 参考>

Sub test()

Dim Acc_ID As Integer
Dim X_Acc_ID As Object
Dim R_X_Acc As Integer
Dim MySheet As String

MySheet = "MySheet"
Acc_ID = 12345

With Workbooks("外部データX.xlsx").Worksheets("入金").Columns(4)

Set X_Acc_ID = .Find(Acc_ID)

If X_Acc_ID Is Nothing Then

Else

'列番号を取得
'R_X_Acc = .Cells.Find(Acc_ID).End(xlDown).Row ← .End(xlDown)はいらない
'      ↑ このCellsはいらないのでは?

R_X_Acc = .Find(Acc_ID).Row
Dim m As Integer

For m = 0 To 11 '---12か月

'ThisWorkbook.Worksheets(MySheet).Cells(20, 9 + m) = .Cells(R_X_Acc + 1, 1 + m) ← 1 + mではない

ThisWorkbook.Worksheets(MySheet).Cells(20, 9 + m) = .Cells(R_X_Acc + 1, 2 + m)

Next m

End If

End With

End Sub


それでは
    • good
    • 0
この回答へのお礼

早速ありがとうございます。うまく動きました。
説明に不足がありまして申し訳ありません。ご想定の通りです。

ネットや本をみて見よう見まねで作っているのでそれぞれのコードをよく理解していませんでした。。。

改めましてありがとうございます。助かりました!

お礼日時:2011/07/11 21:22

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