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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

4回答

3218閲覧

VBA 変数に格納した値がコピーできない。

zuzu1984

総合スコア31

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2017/08/17 11:53

編集2017/08/17 11:53

ブックの中に複数のシートが存在しています。
Sheet1(DATA)の中から文字列を検索し、必要な情報を抜き出します(変数に格納)。
変数に格納できていることは、MsgBoxで確認したのでできていると思います。

Sheet1(DATA)で取得した情報を、Sheet2の所定の場所に持ってきたいのですが、
以下のコードでは書き出されません。

尚、使用しているのはExcel2010です。

[Sheet1]
イメージ説明

[Sheet2]
イメージ説明

VBA

1Sub Test() 2 3 Dim X, Y As Integer 4 Dim HHP(7), ECO(7) As String 5 6 MT = "111_ABC" 7 8 Sheets("DATA").Activate 9 Cells.Find(what:=MT).Activate 10 11 X = ActiveCell.Row 12 Y = ActiveCell.Column 13 reHHP = X + 28 14 reECO = X + 1 15 16 For I = 0 To 6 17 'MsgBox Cells(reHHP+I, Y).Value 18 HHP(7) = Cells(reHHP + I, Y).Value 19 'MsgBox Cells(reECO+I, Y).Value 20 ECO(7) = Cells(reECO + I, Y).Value 21 Next I 22 23 Sheets("Sheet2").Activate 24 For M = 0 To 6 25 Cells(M + 3, "C").Value = HHP(M) 26 Cells(M + 3, "C").Value = HHP(M) 27 Next M 28 29End Sub

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

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

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

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

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

guest

回答4

0

処理については他の方が回答されているので気になった点を指摘しておきます。

VBA

1 Dim X, Y As Integer 2 Dim HHP(7), ECO(7) As String

上記の宣言で、XとHHP(7)はintegerやStringでは定義されていません。
型を省略していることになるのでVariantで定義されていることになります。

また、配列の要素についても、添え字の開始はデフォルトが0なので、範囲を明示的に指定しておくと誤りも少なくなります。
書き換えると以下のようになります。

VBA

1 Dim X As Integer, Y As Integer 2 Dim HHP(0 TO 6) As String, ECO(0 TO 6) As String

エクセル操作に合わせるなら1始まりの方が分かりやすいと思うので、以下のような記述もありです。

VBA

1 Dim X As Integer, Y As Integer 2 Dim HHP(1 TO 7) As String, ECO(1 TO 7) As String

投稿2017/08/17 15:44

sazi

総合スコア25138

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

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

zuzu1984

2017/08/21 14:58

ありがとうございます。 まだLOOPもしっかりと理解していない状態で、何とかやってみようと頑張ったのですが。 丁寧な解説ありがとうございます。 大変参考になりました。
guest

0

変数に格納できていることは、MsgBoxで確認したのでできていると思います。

残念ですが、取得はできていますが格納はできていません。
Msgboxでなく、ウォッチ式の追加をしてデバッグ実行すればすぐに気づいたかと思います。

'MsgBox Cells(reHHP+I, Y).Value HHP(7) = Cells(reHHP + I, Y).Value

TakuyaSuemura さんの指摘のとおり、配列の8番目を常に上書きしています。

途中だと思いますが、書き出しの部分では
HHPしか使っていないため、ECOの値は出力されません。
あと、Mは0~6(つまり7個)なので、配列の8番目が出力されることはありません。

For M = 0 To 6 Cells(M + 3, "C").Value = HHP(M) Cells(M + 3, "C").Value = HHP(M) Next M

VBAの配列宣言は個人的には気持ち悪くて、Dim HHP(7), ECO(7) As Stringとやると、要素数が7の配列でなく、最大indexが7の配列(つまり要素数が8)が定義されます。

投稿2017/08/17 13:09

momon-ga

総合スコア4820

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

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

zuzu1984

2017/08/21 15:00

変数に格納できていると思っていました。 MsgBoxはその時その時で上書きされていっていたんですね。 大変勉強になりました。 LOOPもしかり理解して極めようと思います。 ありがとうございました。
guest

0

ベストアンサー

こんな感じでしょうか?
よくわからないところはVBA内にコメントアウトしました。

たぶんreHHP = X + 28が凶悪なのでそこを確認ください。
(ほかの部分はポカだと思いますので、適当に動くように直しました)

■仕上がりイメージ
※黄色部分がreHHPの空っぽ部分です。
仕上がりイメージ

VBA

1' なるべく明示的に定義しましょう 2Option Explicit 3 4Sub Test() 5 6 ' セルの行列を定義するとき、integerで定義すると万が一の時に困るので、Longに修正しました。 7 Dim X, Y As Long 8 9 ' 要素の番号は「ほしい個数-1」でOKです(0番目から始まるからですね) 10 Dim HHP(6), ECO(6) As String 11 12 ' MTを明示的に定義しました 13 Dim MT As String 14 MT = "111_ABC" 15 16 ' Activesheetは(経験上)あまりあてにしない方がよいと思います。 17 ' メンテする都合上、withでくくったほうがバグりにくいです。 18 With ThisWorkbook.Worksheets("DATA") 19 20 With .Cells.Find(what:=MT) 21 X = .Row 22 Y = .Column 23 End With 24 25 Dim reHHP, reECO As Long 26 ' たぶんここの+28が大きすぎて、HHPの後半の値が""になっています。 27 reHHP = X + 28 28 reECO = X + 1 29 30 Dim I As Integer 31 For I = 0 To 6 32 ' For文のIに合わせて格納でよいですね? 33 HHP(I) = .Cells(reHHP + I, Y).Value 34 ECO(I) = .Cells(reECO + I, Y).Value 35 Next I 36 37 ' ******************************************************************** 38 ' デバグ()HHPの後半の値が""になってしまっていますので確認ください。 39 MsgBox "HHPの要素数: " & UBound(HHP) + 1 & vbCrLf & _ 40 "HHPの中身: " & Join(HHP, ",") 41 MsgBox "ECOの要素数: " & UBound(ECO) + 1 & vbCrLf & _ 42 "ECOの中身: " & Join(ECO, ",") 43 ' ******************************************************************** 44 End With 45 46 ' Sheets("Sheet2").Activate 47 ' "DATA"と同様の理由でwithでくくりました 48 With ThisWorkbook.Worksheets("Sheet2") 49 Dim M As Integer 50 For M = 0 To 6 51 .Cells(M + 3, "C").Value = HHP(M) 52 53 'ECOの値をセルに記入、ですよね? 54 .Cells(M + 12, "C").Value = ECO(M) 55 Next M 56 57 ' おまけ 58 .Select 59 End With 60End Sub 61

投稿2017/08/17 13:31

編集2017/08/17 13:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

HHP(7)ECO(7)のインデックスがループの中で固定値になってません?

For I = 0 To 6 HHP(I) = Cells(reHHP + I, Y).Value ECO(I) = Cells(reECO + I, Y).Value Next I

投稿2017/08/17 12:26

tsuemura

総合スコア663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問