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

下記のソースで実行したら、
MyStr1(1) = "CCC" ' の行まで
実行できて、それから

"実行時エラー'9'"
"インデックスが有効範囲にありません。"

というエラーが出ています。
何かいけないか、わからないから、ここで質問をさせて頂きます。
※環境はExcel2003です。
-------------------------------------------
Sub Macro1()
'

M = 3
N = 2

Sheets("Old").Select
Sheets("Old").Copy Before:=Sheets(1)
Sheets("Old (2)").Select
Sheets("Old (2)").Name = "TTT"

Dim MyStr1() As String
Dim K As Long

ReDim MyStr1(K)

MyStr1(0) = "AAA" & Chr(10) & "BBB"
MyStr1(1) = "CCC" ' <----------------------------------エラーとなった行
MyStr1(2) = "DDD"
MyStr1(3) = "EEE"
MyStr1(4) = "FFF"
MyStr1(5) = "JJJ"
MyStr1(6) = "KKK"



For K = 0 To 7 'セル1の判断ループ

X = 1
Y = 1
M = 3
N = N + 1

For Y = 1 To 100
For X = 1 To 300





If Sheets("Old").Cells(X, Y) = MyStr1(1) Then
For M = 3 To 300
X = X + 1
If Sheets("Old").Cells(X, Y) <> Sheets("New").Cells(X, Y) Then
Sheets("TTT").Cells(X, Y).Select
With Selection.Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 6

End If
Next M

End If


Next X
Next Y


Next K

End Sub
------------------------------------------------------
素人なので、何か説明が足りなかったら、ご容赦してください。

「マクロ_シート内容の比べについて」の質問画像

A 回答 (4件)

えっと・・・おかしなところが多すぎます。



#1でも示しましたが

ReDim MyStr1(K)
これは動的配列の再宣言で K に数値が代入されていなければ要素数が0のままです。

For~Next のネストはOKですが Mのループで親ループのXを加算しているので、Xのループは失敗します。

Mのループと X = X + 1 は不要でしょう。

>If Sheets("Old").Cells(X, Y) = MyStr1(1) Then

せっかく配列を使っているのに  MyStr1(1) では意味がありません。
MyStr1(K) 
です。

N = N + 1
変数Nは使われていません

この回答への補足

丁寧の説明にありがとうございました。
プログラム目的の説明が不足で、すみませんでした。


本件について、やりたいことは以下のとおりです。

1 既存シートが"Old" "New" "Temp"の3枚があります。
 "Old"シートと"New"シートは行の項目(AAA-KKK)同じ、列の内容が異なるモノとなり、
そして、比べる対象シートであり、
  Tempシート内はマクロのコントロールボタン(実行、キャンセルなど)を置いている

2 "Old"シートの内容を丸コピーで"TTT"シートに作成し、実行結果を反映する用

3 マクロの流れは、まずMyStr1配列の内容で"Old"シート項目(AAA-KKK)のセル位置を
  1ずつ確定してから、"Old"シートと"New"シートの該当部分を比べる。
  そして、異なる部分が見つければ。、"TTT"シート内の同じセルの色を変更で、結果を示すことである。
※AAAーKKKの項目が比較する対象外なので、次の行を移動する"X = X + 1"が必要となる


その為、質問したソースを次のように直して、目的が達成できました。
ReDim MyStr1(K) -> ReDim MyStr1(7) 変更
If Sheets("Old").Cells(X, Y) = MyStr1(K) Then 変更
N = N + 1 削除


なお、今後機能アップする予定があるので、まだわからないことがあると思いますので、宜しくお願いします。 (^@^)

補足日時:2009/06/28 00:42
    • good
    • 0

おせっかいついでに…



前回のご質問(http://oshiete1.goo.ne.jp/qa5074351.html)でも申し上げましたように、「やりたいこと」とコードの食い違いが多すぎるので、このまま皆様に質問を続けても、ゴールに着くまでに相当量の質問が必要になりそうです。
仮に、エラーが出なくなっても、目的とは違う動作になっているかもしれません。

まず、「やりたいこと」を再整理し、これに沿ってコードの構成を見直すことをお勧めします。
(現状だと、ご説明の「やりたいこと」と提示されているコードとの関連が理解できない部分が多すぎます。)


ついでに言わせてもらうなら、今、出ているエラーも、前回私が指摘済みのことが原因ですよ。(Kの値が未定)
    • good
    • 0
この回答へのお礼

ご指摘、ありがとうございました。


ご指摘の通り、目的説明の不足で回答して頂いた皆様にお手間をかけまして、すみませんでした。

これからも、続けてマクロを勉強しますから、何かあれば、まだ宜しくお願いします。

お礼日時:2009/06/28 00:55

>ReDim MyStr1(K)


ReDim MyStr1(7)
で宜しいのでは?

この回答への補足

そして、Sinogiさんの指摘でほかの部分も修正して、ついにプログラムが
うまくいきました。
※"さん"を抜けて、失礼しました。

補足日時:2009/06/28 00:49
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございました。^@^
ReDim MyStr1(7)に直しました。

そして、Sinogiの指摘でほかの部分も修正して、ついにプログラムが
うまくいきました。

お礼日時:2009/06/28 00:47

>Dim K As Long


>
>ReDim MyStr1(K)

これを
Dim K As Long
K=7
ReDim MyStr1(K)

でいかがですか
    • good
    • 0

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