• 締切済み

マクロ シート内容の比べについて

下記のソースで実行したら、 MyStr1(0) = "AAAAAA" & Chr(10) & "BBBBBB" ' の行で "実行時エラー'9'" "インデックスが有効範囲にありません。" というエラーが出ています。 調べても、わからないから、ここで質問をさせて頂きます。 最初に"Old""New""TEMP"3枚のシートが既存しています。 やりたいのは、"Old"シートと"New"シートの内容を検索して、異なる部分を探すことです。 ---------------------------------------------------------------- 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 MyStr(K) MyStr1(0) = "AAAAAA" & Chr(10) & "BBBBBB" 'エラーになった行 MyStr1(1) = "CCCC" MyStr1(2) = "DDDDD" MyStr1(3) = "FFFFFFFFF" MyStr1(4) = "EEEEEEE" MyStr1(5) = "SSSSSSSSS" MyStr1(6) = "GGGGGGGGG" For K = 0 To 6 X = 1 Y = 1 M = 3 N = N + 1 For Y = 1 To 100 For X = 1 To 300 'セル1の判断ループ If Sheets("Old").Cells(X, Y) = MyStr1(K) 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 ----------------------------------------------------------- 以上、宜しくお願いします。

  • xlhjp
  • お礼率56% (81/144)

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

回答はすでに出ていると思いますが、ついでに… ご提示のコードが途中を省略していないのだとすると、  ReDim MyStr(K) の実行時にKの値が入っていないのでは?(0として扱われるのかな?) >最初に"Old""New""TEMP"3枚のシートが既存しています。 TEMPのシートはどこにも出てこないみたいだけど? >やりたいのは、"Old"シートと"New"シートの内容を検索して、 >異なる部分を探すことです。 という内容と、セルの値とMyStr1() とを比較することの関連性が不明です。 ループのまわし方も、↑の「やりたいこと」から判断すると、ずいぶん違うように見えます。 (やりたいことが、全部書いてないのかも知れませんが…)

xlhjp
質問者

お礼

説明不足ですみませんでした。 回答を参照しても、解決してないから、まだ質問がさせていただきます。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.1

ReDim MyStr(K) MyStr1(0) = "AAAAAA" 宣言している配列と使用している配列の名前が違います

xlhjp
質問者

お礼

ご指摘の通りに直しましたが、結果が変わらないです。 問題を解決してないから、別件として、再度質問をさせていただきます。

関連するQ&A

  • マクロ_シート内容の比べについて

    下記のソースで実行したら、 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 ------------------------------------------------------ 素人なので、何か説明が足りなかったら、ご容赦してください。

  • マクロを簡潔にしたいので教えてください。

    Sub 記入() Dim testno As String Dim testrow As Long Dim basedata(1 To 10) As String Dim weight(1 To 16) As Double Sheets("sh3").Select '(1) testno = Range("B23").Value 'No. Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sheet3").Select Cells(3, 1) = testno For i = 1 To 10 Cells(3, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(3, i + 11) = weight(i) Next i Sheets("sh3").Select Erase basedata Erase weight '(1) testno = Range("B24").Value 'No. Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sh3").Select Cells(4, 1) = testno For i = 1 To 10 Cells(4, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(4, i + 11) = weight(i) Next i Sheets("sh3").Select Erase basedata Erase weight この間同様文12個あり '(1) testno = Range("B37").Value If testno = "" Then End End If Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sh3").Select Cells(17, 1) = testno For i = 1 To 10 Cells(17, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(17, i + 11) = weight(i) Next i End Sub

  • VBAtest

    VBAおn以下の Sheets("OP").Select Dim atai As String atai = Cells(2, 2).Value Dim datedata(40) As String For j = 0 To 40 If Cells(j + 3, 2).Value = "" Then Else datedata(j) = Cells(j + 3, 2).Value End If Next Dim shihyou As String For i = 1 To 2 shihyou = Cells(2, i + 2).Cells.Value Sheets(shihyou).Select Dim tmp_c As Integer For r = 1 To 10 tmp_c = 0 For c = 1 To 10 If tmp_c = 0 Then If Sheets(shihyou).Cells(r, c).Value = atai Then tmp_c = c End If Else Dim vals(40) As String For k = 0 To 40 For l = 1 To r + 41 For m = 1 To tmp_c - 1 If Sheets(shihyou).Cells(l, m).Value = datedata(k) Then vals(k) = Sheets(shihyou).Cells(l, tmp_c).Value End If Next Next Next End If Next Next Sheets("OP").Select For k = 3 To 43 Cells(k, i + 2).Value = vals(k - 3) Next Next End Sub

  • VBAのSheet.copyとsheet.selectについて

    For i = 1 To 50 Sheets(1).Select Sheets(2).Copy after:=Sheets(2) Sheets(1).Copy after:=Sheets(2) Next のようにして、Excelの2つのSheetを50セットコピーするとします。しかし、最初の何回かは成功するのですが、時々コピーが失敗したというダイアログが出て止まってしまいます。必ず止まるわけではないので原因が分かりません。 また、似たような理由で、 For x = 1 to 100 Sheets(2 + x).Cells(1, 1).Select With ActiveCell.Characters (Start:=9, Length:=2).Font .ColorIndex = 3 Next End With のように回していると、「Rengeクラスのselectメソッドが失敗しました」というエラーダイアログが出てしまうことがあります。成功する時は成功します。 どなたか教えてください。

  • マクロで検索行・データが入力されている部分を変更したい

    下記4行目に入力されている行は常に変わる為、このままでは検索にかなりの時間が掛かってしまいます。出来ることならデータ入力の最終の行で検索終了したいのですがどうかご教授お願いいたします。 1 Sub Macro1() 2 For a = 1 To 3000 3 snum = Sheets(2).Cells(a, 11) 4 For b = 1 To 200 'ここはSheet1でデータが入力されてる行数 5 If snum = Sheets(1).Cells(b, 1) Then 6 Sheets(2).Cells(a, 12).Value = Sheets(1).Cells(b, 2) 7 Sheets(2).Cells(a, 13).Value = Sheets(1).Cells(b, 3) 8 Sheets(2).Cells(a, 14).Value = Sheets(1).Cells(b, 4) 9 Exit For 10 End If 11 Next 12 Next 13 End Sub

  • エクセルマクロでシートの切り替え場うまくいかない。

    エクセルマクロでシートの切り替え場うまくいかない。 以下のマクロで「Acount」から抜けて「Bcount」に移った時BcamのBsheetではなくAsheetをそのまま読み込んでしまいます。 なぜだかわかりますか。 For Bcount = 3 To 52 Bcam = Worksheets(Bsheet).Cells(Bcount, retu + 1) For Acount = 4 To 92 Acam = Worksheets(Asheet).Cells(Acount, retu + 1) Rp = Worksheets(Asheet).Cells(Acount, retu + 8) If Acam = Bcam Then Sheets(Bsheet).Cells(gyou + 2, Xscal + 1) = Application.RoundDown(Rp, -3) Sheets(Bsheet).Cells(gyou + 2, Xscal + 2) = Acam Sheets(Bsheet).Cells(gyou + 2, Xscal + 3) = Bcam Sheets(Bsheet).Cells(gyou + 2, Xscal + 4) = Acount Sheets(Bsheet).Cells(gyou + 2, Xscal + 5) = Bcount gyou = gyou + 1 Acam = Worksheets(Asheet).Cells(gyou + 3, retu + 1) Rp = Worksheets(Asheet).Cells(gyou + 3, retu + 8) End If Next Next

  • マクロで全てのシートで条件を満たすシートに行を挿入するにはどうしたらいいですか

    マクロ初心者です。自分でも作ってみたのですが、なかなか思うようにいかず困っています。 book内のシート3つ目から最後のシートで、条件に一致するシートの特定位置に行を挿入するということがしたいのですが。 条件とは、1列目の最後の行に「合計」と記入されていれば、行を4行挿入し、上の書式をコピーするというものです。 下記に記しているマクロは、シートを指定した場合には動くのですが、これにシートをnとして、FOR...Nextを付け加えてシートを順番に参照させようとしても、うまくいきません。 Sub 行挿入sample3() With Sheets("10007") For i = 7 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i + 1, 1) = "" Then Exit For ElseIf .Cells(i + 1, 1) = "合計" Then Range(Cells(i + 1, 1), Cells(i + 4, 1)).Select Selection.EntireRow.Insert Range(Cells(i, 1), Cells(i, 3)).Select Selection.Copy Range(Cells(i + 1, 1), Cells(i + 4, 3)).PasteSpecial xlPasteFormats End If Next i End With End Sub 知識をお持ちの方、教えていただけるととても助かります。よろしくお願いします。

  • エクセルVBAで複数シートにマクロ実行

    エクセル2000です。 Sub 行列非表示() For i = 2 To 120 If Cells(i, "A").Interior.ColorIndex = 3 Then Cells(i, "A").EntireRow.Hidden = True End If Next i For n = 1 To 50 If Cells(1, n).Interior.ColorIndex = 3 Then Cells(1, n).EntireColumn.Hidden = True End If Next n End Sub 上記マクロを、シートAAAとCCCとEEEに実行する場合、 Sub test() Sheets("AAA").Activate Call 行列非表示 Sheets("CCC").Activate Call 行列非表示 Sheets("EEE").Activate Call 行列非表示 End Sub と書くよりももっとすっきり実行する方法は無いでしょうか? 各シートの非表示対象の行や列はそれぞれことなります。 また Sub 行列非表示 自体も、もっと効率的にやる方法はないでしょうか?

  • エクセルのシートをマクロで並び替えたいです。

    以前に、Q&Aがあったので、下記の物を入れてみましたが、シート名に会社名を入れている為、前(株)○○となると、全て(株)で集まってしまいます。 エクセル2003を使っています。 Sub SortSheets() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub ご理解いただけますでしょうか? お分かりになられる方宜しくお願い致します。

  • VBAの記述で、あるシートを別ファイルにした場合

    エクセル2002で、商品を管理しています。 1列目に品番をいれると、2列目に品名が表示するようにし、 新規の品番は品名を入れると、追加登録されるようにVBAを組みました。 今度、このシート"商品"を別ファイル(商品.xls)にしたいと思うのですが、 どうしても、やり方が分かりません。 よろしくお願いします。 Public Sub Worksheet_Change(ByVal Target As Excel.Range) Dim 品番 As String Dim 品名 As String Dim i As Long With Target If .Column = 1 Then 品番 = .Text For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then ActiveSheet.Cells(.Row, 2) = "" Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then ActiveSheet.Cells(.Row, 2) = Sheets("商品").Cells(i, 2) Exit For End If Next i End If If .Column = 2 Then 品名 = .Text 品番 = ActiveSheet.Cells(.Row, 1) If 品名 = "" Or 品番 = "" Then Else For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then Sheets("商品").Cells(i, 1) = 品番 Sheets("商品").Cells(i, 2) = 品名 Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then Exit For End If Next i End If End If End With End Sub

専門家に質問してみよう