Excel2007で複雑なセルコピペ。インデックス有効範囲エラーの解決方法

このQ&Aのポイント
  • Excel2007で複雑なセルコピペを行う際に発生する「インデックス有効範囲エラー」の解決方法を教えてください。
  • [SetData]モジュールで変更した箇所とその値、エラーが起こった時のi、j、kの値を教えてください。
  • 質問者はExcel2007でリボルビングセル範囲のコピペを行いたかったが、エラーが発生しました。i、j、kの値は1でした。
回答を見る
  • ベストアンサー

Excel2007で複雑なセルコピペ。続きです

>>「インデックス有効範囲エラー」がでました。 申し訳ありませんが ・[SetData]モジュールで変更した箇所とその値 ・エラーが起こった時のi、j、kの値 を教えてください。 i、j、kは、エラーでストップした際、それぞれの変数の上にマウスカーソルを動かせば表示される筈です。 或いは右クリック-[ウォッチ式の追加]で、ウォッチウィンドウに表示させる方法もあります。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ >・エラーが起こった時のi、j、kの値 を教えてください。 i,j,kの値は1でした。 >・[SetData]モジュールで変更した箇所とその値 リボルビングセル範囲のコピペがしたかったので、こちらを選びました。 Set rangeCompare = myWS.Range("D63:D10000") Rev.OffRow = Array(-55, -57) Rev.OffCol = Array(0, 0) Rev.ResRow = 51 Rev.ResCol = 1 Set rangeResult = myWS.Range("N4") numResult = 2 どうなんでしょうか?長らく時間をとらせて頂いて感謝します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.12

値の比較と背景の着色をサブルーチン化したバージョンのコードも作ってみました。 [CheckSameValue]モジュールに、引数として比較元、比較先、着色する色を指定すれば、比較元と同じ値のセルに着色します。 Sub CompareMain(ByRef rangeCompare As Range, ByRef rev As Revolving, ByRef aryCompare As Variant, ByRef rangeResult As Range, ByRef numResult As Integer, ByRef aryResult As Variant, ByRef clrCompare As Long)  Dim i As Long, j As Integer, k As Integer, cnt As Integer  Dim numRow As Integer, numCol As Integer '比較元セル範囲の左上の行番号、列番号。  Dim numRev As Integer '使用するリボルビング配列の番号。  '比較する値を、出力する並びでaryResultに格納。  numRow = rangeCompare(1).Row  numCol = rangeCompare(1).Column  For i = 1 To rangeCompare.Rows.Count   aryResult(i, 1) = aryCompare(numRow + i - 1, numCol) '比較元の値をコピー   cnt = numResult '結果の比較先の出力列番号。   numRev = (i - 1) Mod (UBound(rev.OffRow) + 1)   For j = 1 To rev.ResRow    For k = 1 To rev.ResCol     aryResult(i, cnt) = aryCompare(numRow + i - 1 + rev.OffRow(numRev) + j - 1, numCol + rev.OffCol(numRev) + k - 1)    cnt = cnt + 1    Next k   Next j  Next i  '更新停止  Application.EnableEvents = False  Application.ScreenUpdating = False  Application.Calculation = False  'セルに出力、着色。  rangeResult = aryResult 'セルに出力  For i = 1 To rangeResult.Rows.Count   Call CheckSameValue(rangeResult(i, 1), Range(rangeResult(i, numResult), rangeResult(i, rangeResult.Columns.Count)), clrCompare)  Next i '更新再開  Application.EnableEvents = True  Application.ScreenUpdating = True  Application.Calculation = True End Sub Sub CheckSameValue(ByRef BaseCell As Range, ByRef CheckRange As Range, ByRef clrCompare As Long) 'CheckRange内にBaseCellと同じ値があった場合、そのセルとbaseCellの背景色をclrCompareとする。  Dim myCell As Range  For Each myCell In CheckRange   If BaseCell.Value = myCell.Value Then    BaseCell.Interior.Color = clrCompare    myCell.Interior.Color = clrCompare   End If  Next myCell End Sub

961awaawa
質問者

お礼

ありがとうございました!

その他の回答 (11)

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.11

[CompareMain]モジュールを以下のものに差し替えてみて下さい。 「'着色するセル位置を検索」以降を変更し、一旦blnPaintに着色の有無を格納するのを止めてみました。 これでどうでしょうか? Sub CompareMain(ByRef rangeCompare As Range, ByRef rev As Revolving, ByRef aryCompare As Variant, ByRef rangeResult As Range, ByRef numResult As Integer, ByRef aryResult As Variant, ByRef clrCompare As Long)  Dim i As Long, j As Integer, k As Integer, cnt As Integer  Dim numRow As Integer, numCol As Integer '比較元セル範囲の左上の行番号、列番号。  Dim numRev As Integer '使用するリボルビング配列の番号。  '比較する値を、出力する並びでaryResultに格納。  numRow = rangeCompare(1).Row  numCol = rangeCompare(1).Column  For i = 1 To rangeCompare.Rows.Count   aryResult(i, 1) = aryCompare(numRow + i - 1, numCol) '比較元の値をコピー   cnt = numResult '結果の比較先の出力列番号。   numRev = (i - 1) Mod (UBound(rev.OffRow) + 1)   For j = 1 To rev.ResRow    For k = 1 To rev.ResCol     aryResult(i, cnt) = aryCompare(numRow + i - 1 + rev.OffRow(numRev) + j - 1, numCol + rev.OffCol(numRev) + k - 1)     cnt = cnt + 1    Next k   Next j  Next i  '更新停止  Application.EnableEvents = False  Application.ScreenUpdating = False  Application.Calculation = False  'セルに出力、着色。  rangeResult = aryResult 'セルに出力  For i = 1 To rangeResult.Rows.Count   For j = numResult To rangeResult.Columns.Count    If aryResult(i, 1) = aryResult(i, j) Then     rangeResult(i, 1).Interior.Color = clrCompare     rangeResult(i, j).Interior.Color = clrCompare    Else     rangeResult(i, j).Interior.ColorIndex = xlColorIndexNone    End If   Next j  Next i  '更新再開  Application.EnableEvents = True  Application.ScreenUpdating = True  Application.Calculation = True End Sub

961awaawa
質問者

お礼

こんばんはmathmi さん。出来ました!!! 無茶苦茶嬉しいです。でも完璧に私自身は追い付けてないんです。それは当然で経験がまだまだ初期段階なんで_(^^;)ゞ 私の質問はもうmathmi さんしか分かってもらえない気がするくらいあなたを尊敬します。(^-^)ゝ゛ またこの続きがあるんで、似たような感じの質問を指名でさせてください。 この度は誠に感謝します。ありがとうございました。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.10

>M列のセル値と水平上にある同値の全てのセルの背景色染めの方法 今までの要望通り、No.5の添付画像のように着色したい、という事ですよね。 No.3にある今までのコードを使えば要望通りの結果になる筈で、自分の方で試した結果要望通りの結果が出ているんです。 バグの再現ができないので、デバッグが行き詰っているのが現状です。 背景色を着色するルーチンを、一回作り直して見ます。 1:使用しているソフトは、純正officeのexcelですよね? open officeやLibra officeではありませんよね? 2:新規ブックに、自分の作ったコードと比較するD列の値だけ入れても、同じ様に全ての出力範囲の背景色が着色されますか?

961awaawa
質問者

お礼

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

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.9

>変化無しでやはりベターっと黄色のまんまです。  駄目でしたか。申し訳ありません。 >一度にすると難しいんですかね? いえ、それほど難しくはない筈です。実際、自分のパソコンで実行した場合にはきちんと実行されるので。 そうなると、済みません。現状エラーの原因が分かりません。 (No6の2:でMN列も着色されなかったり、1:でstopに行けるのに着色されたりと、コード上あり得ない筈なのですが) 最終手段ですが、そのエラーが発生しているエクセルファイルを送って貰う事はできませんでしょうか? エラーが再現できれば、他の部分は不要ですので。 (極端な話、D列に入れたランダムな値と、問題のコードだけのファイルでも、同様のエラーが発生するなら問題ありません) firestorageのようなファイル転送サービスを使うか、捨てアド同士でファイルを受け渡す事になるかと思いますが、ご一考お願いしたく思います。

961awaawa
質問者

お礼

mathmi さん、ご助力ありがとうございます。 リボルビングでの範囲の横化O列からのコピペは成功したので M列のセル値と水平上にある同値の全てのセルの背景色染めの方法を教えて欲しいです。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.8

色々と確認して頂き、ありがとうございます。 どうも、boolean型の変数であるblnPaintの初期値が、FalseではなくTrueになっているようです。 「'着色するセル位置を検索」ブロック、[ReDim blnPaint(1 To rangeResult.Rows.Count, 1 To rangeResult.Columns.Count)]の下側に、以下の5行を追加してください。  For i = 1 To rangeResult.Rows.Count   For j = 1 To rangeResult.Columns.Count    blnPaint(i, j) = False   Next j  Next i これで、想定通りの動きをする筈です。

961awaawa
質問者

お礼

こんにちはmathmi さん。してみましたが、変化無しでやはりベターっと黄色のまんまです。 一度にすると難しいんですかね? 分けてマクロの記録でする 形にして頂けたらと…。 でもここまできて後ちょっとで出来そうな予感もしますしね。 どっちにしても私1人じゃとてもできません。Excelってできると便利ですね。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.7

回答ありがとうございます。 どうも、「'セルに出力、着色。」ブロックのIf~Thenが上手く働いていないか、blnPaintの初期値がtrueになっているっぽいのですが……。 一回、以下の変更を別々に試してみて下さい。 (これは、問題点を見つける為の変更なので、本来のコードを変更するものではありません) 1:「'セルに出力、着色。」ブロック [rangeResult(i, j).Interior.Color = clrCompare]と[End If]の間に    Else     Stop の2行を追加して、[stop]で止まるか試してみて下さい。 2:「'着色するセル位置を検索」ブロック [blnPaint(i, j) = True]と[End If]の間に    Else     blnPaint(i, j) = False の2行を追加してみて下さい。 上手く行けば、O列以降で重複しないセルは着色されなくなる筈です(M列N列はまだ全着色)。 3:「'セルに出力、着色。」ブロック [rangeResult = aryResult]と[For i = 1 To rangeResult.Rows.Count]の間に[Exit Sub]を追加してみて下さい。 想定では、値だけが出力されてセルの背景色は変わらないはずなのですが、マクロ実行前から変わっていますか? 4:他のマクロがないか確認。 特にシートモジュール(Microsoft Excel Objectsの下の、Sheet1(Sheet1)とかの名前のモジュール)に設定されていませんか? あれば、そのプロシージャ名(Sub *** ()の***の部分)を教えてください。 5:出力先に条件付き書式が設定されていないか確認。 比較する値がD5000までしかないのに、9941まで着色されているという事は、この問題ではないと思いますが、一応確認お願いします。

961awaawa
質問者

お礼

>1:「'セルに出力、着色。」ブロック [rangeResult(i, j).Interior.Color = clrCompare]と[End If]の間に    Else     Stop の2行を追加して、[stop]で止まるか試してみて下さい。 334 行目まで黄色にそまり、ソースのstop が黄色になりました。 >2:「'着色するセル位置を検索」ブロック [blnPaint(i, j) = True]と[End If]の間に    Else     blnPaint(i, j) = False の2行を追加してみて下さい。 上手く行けば、O列以降で重複しないセルは着色されなくなる筈です(M列N列はまだ全着色)。 MN 列含めた重複しない行だけが無色でした。 >3:「'セルに出力、着色。」ブロック [rangeResult = aryResult]と[For i = 1 To rangeResult.Rows.Count]の間に[Exit Sub]を追加してみて下さい。 想定では、値だけが出力されてセルの背景色は変わらないはずなのですが、マクロ実行前から変わっていますか? 仰る通り値だけでした。無色でした。 >4:他のマクロがないか確認。 特にシートモジュール(Microsoft Excel Objectsの下の、Sheet1(Sheet1)とかの名前のモジュール)に設定されていませんか? あれば、そのプロシージャ名(Sub *** ()の***の部分)を教えてください。 sheetモジュールには無いです。 >5:出力先に条件付き書式が設定されていないか確認。 比較する値がD5000までしかないのに、9941まで着色されているという事は、この問題ではないと思いますが、一応確認お願いします。 確認の仕方が下手なんで教えて頂けませんか? 多分無いとは思いますが

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.6

>No 3のソースをM4の件以外はストレートに写しました。 回答ありがとうございます。 何の変更もせず、ただコピーしたコードを実行して >全セルの背景色が黄色くなってしまってました となったんですか。 すみません。ちょっと想定外でした。 とりあえず、基本中の基本から確認していきます。当然だと思われるような項目もありますが、確認ですのでご容赦を。 1:D7:D10000には値が入っていますか? 2:出力先(M列やO列以降)には、想定した値が出力されていますか(M4にはD63の、O4にはD8の値等)? 3:着色された部分には、異なる値が出力されていますか(M4とO4は別の値なのに、両方着色されている等)? 4:空白であるべきN列にも着色されていますか? 5:N列に値は出力されていませんか? 6:範囲外の行(1:3行や9943行以降)は着色されていませんか? 7:マクロを実行する前、出力する予定の範囲(M列以降)の背景色に何も設定されていませんか(無色ですか)? 8:実行するマクロは間違いありませんか(シートのボタンにマクロを紐づけていたりして、新しいマクロに紐づけを更新してなかったりなど)? 9:出力先セル(M列以降)が結合されてはいませんか? 一応、「'着色するセル位置を検索」ブロックのIf~Then行とEnd If行をコメントアウトした場合、N列以外の出力セル全てに着色されました(添付画像参照)。 「'セルに出力、着色。」ブロックの場合は、N列にも着色されました。

961awaawa
質問者

お礼

>1:D7:D10000には値が入っていますか? 途中(5000行目)しか入ってないです。なので× >2:出力先(M列やO列以降)には、想定した値が出力されていますか(M4にはD63の、O4にはD8の値等)? 大丈夫です。○ >3:着色された部分には、異なる値が出力されていますか(M4とO4は別の値なのに、両方着色されている等)? M4 からEM9941までびっしりと黄色くなってます。なので× >4:空白であるべきN列にも着色されていますか? ハイ >5:N列に値は出力されていませんか? 出力無しです。 >6:範囲外の行(1:3行や9943行以降)は着色されていませんか? 9941まで着色ありで升目がなくなってます。 7:マクロを実行する前、出力する予定の範囲(M列以降)の背景色に何も設定されていませんか(無色ですか)? C列~I列に着色ありです。 8:実行するマクロは間違いありませんか(シートのボタンにマクロを紐づけていたりして、新しいマクロに紐づけを更新してなかったりなど)? ここは理解が難しいです。(マクロに紐付けと言う表現がわからないです。) 9:出力先セル(M列以降)が結合されてはいませんか? 結合セルはないです。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.5

>M4 の値が3ならO4から横に50セル範囲の内に同じ値3のセル背景の色を色付けしたいと言う意味でした。 あ、判定方法は変わっていなかったのですね。申し訳ありません。 こちらで使用した場合同じ値の場所にしか着色されていない事と、改めて書かれている事から、判別条件が変わったものと勘違いしてしまいました。 >全セルの背景色が黄色く aryResultに代入する値がおかしいのか、「'着色するセル位置を検索」ブロックの条件式がおかしいのか、「'セルに出力、着色。」ブロックの条件式がおかしいのか。 現状では、エラーの原因が特定できません。 使用しているコードをアップできますか? 或いは、どこをどのように変更したのかを教えて下さい。 参考までに、こちらで実行した結果の一部の画像を添付します。実際には、画面の右側(V列以降)や下側(22行以降)にも出力した値は続いています。 M18/M20の背景色が黄色でないのは、右側の画像外の範囲にも一致する値がないからです。

961awaawa
質問者

お礼

返答ありがとうございますmathmi さん。No 3のソースをM4の件以外はストレートに写しました。それだけなんです。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.4

>M4の隣のN列は空けておいてO4から [Set rangeResult = myWS.Range("N4")]のN4をM4に、[numResult=2]の値を2から3に変更します。 これで、M4を1列目とした3列目、即ちO4から右に比較対象がペーストされます。 >全セルの背景色が黄色くなってしまってました 出力するセルが全て着色されたのだとすると、まず考えられるのは、変数blnPaintの中が全てtrueになっている事です。 この変数の値を変えるのは[CompareMain]プロシージャの「'着色するセル位置を検索」ブロックのみなので、問題があるならここのIf~Thenの条件式でしょうか。 >M列の1つ1つのセルの値に、その1つ1つの行上に等しい値の背景色を色付けするのが目的でもあります。 すみません。どのような操作を行いたいのかが理解できません。 M[n+1]のセルの値とM[n]の値を比較し、同じ値の場合は、M[n]の背景色をM[n+1]のセルに色付けするんでしょうか? そうすると、最初の4行目の時の処理が変な事になるし、O[n]~BM[n]との比較の仕方も変わってくるから、違う気がしますが。 何度も言いますが、要望は具体的にお願いします。 機能の追加・変更なら、実際にどのような操作を行いたいのかの具体例を上げて下さい。 (というか「手作業ならどのような操作をするのか」を考えるのは、エクセルマクロを作る時の基本です) エラーが起こったなら、どこをどう変更したらどこでエラーが起こったを明確にして下さい。 いっそ全文上げて貰った方が、デバッグはやりやすいくらいです。

961awaawa
質問者

お礼

>M列の1つ1つのセルの値に、その1つ1つの行上に等しい値の背景色を色付けするのが目的でもあります。 分かりにくい説明でした。 M4 の値が3ならO4から横に50セル範囲の内に同じ値3のセル背景の色を色付けしたいと言う意味でした。 M6の値が7ならO6から横になってる50セル範囲の内に同じ値7のセル背景の色を色付けする。 という形にしたかったんです。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.3

>一度ストレートにソースを書いて頂きたいのです。 前回のNo18,19及び今回の「Set rangeCompare = myWS.Range("D63:D10000")~」を元にしたコードです。 こちらで実行してみた所、エラーは起こっていません。 Option Explicit Type Revolving  OffRow As Variant 'Offset Row。基準セルから比較先セルへの相対行数。  OffCol As Variant 'Offset Column。基準セルから比較先セルへの相対列数。  ResRow As Integer 'Resize Row。比較先セル範囲の行数。  ResCol As Integer 'Resize Column。比較先セル範囲の列数。  v As Variant End Type Sub SetData() '作業対象範囲等を設定するプロシージャ  Dim temp As Variant  Dim myWS As Worksheet '作業を行うワークシート。  Dim rangeCompare As Range '比較元セル範囲。  Dim rev As Revolving 'リボルビング相対位置。  Dim numCompare As Integer '比較先セル範囲個数。  Dim aryCompare As Variant '比較するセル範囲の値。  Dim rangeResult As Range '出力先セル範囲  Dim numResult As Integer '結果を出力する際、比較先を比較元の何列隣から出力するか。0なら同じ列。  Dim aryResult As Variant '結果の値を格納する配列。  Dim clrCompare As Long '値が同じだった場合に着色する色  '作業を行うワークシートを設定  Set myWS = ActiveSheet  '比較元セル範囲を設定  Set rangeCompare = myWS.Range("D63:D10000")  'リボルビング相対位置を設定  rev.OffRow = Array(-55, -57)  rev.OffCol = Array(0, 0)  rev.ResRow = 51  rev.ResCol = 1  numCompare = rev.ResRow * rev.ResCol  'エラーチェック  If rangeCompare.Columns.Count > 1 Then   MsgBox ("比較元が2列以上に設定されています。")   Exit Sub  End If  If UBound(rev.OffRow) <> UBound(rev.OffCol) Then   MsgBox ("リボルビング配列の行数と列数が異なっています。")   Exit Sub  End If  If rangeCompare(1).Row + WorksheetFunction.Min(rev.OffRow) <= 0 Or _   rangeCompare(1).Column + WorksheetFunction.Min(rev.OffCol) <= 0 Then   MsgBox ("シート範囲外と比較しようとしています。")   Exit Sub  End If  If rev.ResRow <= 0 Or rev.ResCol <= 0 Then   MsgBox ("比較先行数もしくは列数が0以下です。")   Exit Sub  End If  '比較セル範囲の値を取得  Set temp = rangeCompare(rangeCompare.Count)  Set temp = temp.Offset(WorksheetFunction.Max(0, WorksheetFunction.Max(rev.OffRow) + rev.ResRow - 1), 0)  Set temp = temp.Offset(0, WorksheetFunction.Max(0, WorksheetFunction.Max(rev.OffCol) + rev.ResCol - 1))  aryCompare = myWS.Range("A1", temp).Value  '出力先セル範囲を設定。  Set rangeResult = myWS.Range("N4") '結果基準セルを設定  numResult = 2  Set rangeResult = rangeResult.Resize(rangeCompare.Rows.Count, numResult + numCompare - 1)  ReDim aryResult(1 To rangeResult.Rows.Count, 1 To rangeResult.Columns.Count)  '着色する色を設定  clrCompare = RGB(255, 255, 153)  Call CompareMain(rangeCompare, rev, aryCompare, rangeResult, numResult, aryResult, clrCompare) End Sub Sub CompareMain(ByRef rangeCompare As Range, ByRef rev As Revolving, ByRef aryCompare As Variant, ByRef rangeResult As Range, ByRef numResult As Integer, ByRef aryResult As Variant, ByRef clrCompare As Long)  Dim i As Long, j As Integer, k As Integer, cnt As Integer  Dim numRow As Integer, numCol As Integer '比較元セル範囲の左上の行番号、列番号。  Dim numRev As Integer '使用するリボルビング配列の番号。  Dim blnPaint() As Boolean 'そのセル位置を着色するか。Trueなら着色する。  '比較する値を、出力する並びでaryResultに格納。  numRow = rangeCompare(1).Row  numCol = rangeCompare(1).Column  For i = 1 To rangeCompare.Rows.Count   aryResult(i, 1) = aryCompare(numRow + i - 1, numCol) '比較元の値をコピー   cnt = numResult '結果の比較先の出力列番号。   numRev = (i - 1) Mod (UBound(rev.OffRow) + 1)   For j = 1 To rev.ResRow    For k = 1 To rev.ResCol     aryResult(i, cnt) = aryCompare(numRow + i - 1 + rev.OffRow(numRev) + j - 1, numCol + rev.OffCol(numRev) + k - 1)     cnt = cnt + 1    Next k   Next j  Next i  '着色するセル位置を検索  ReDim blnPaint(1 To rangeResult.Rows.Count, 1 To rangeResult.Columns.Count)  For i = 1 To rangeResult.Rows.Count   For j = numResult To rangeResult.Columns.Count    If aryResult(i, 1) = aryResult(i, j) Then     blnPaint(i, 1) = True     blnPaint(i, j) = True    End If   Next j  Next i  '更新停止  Application.EnableEvents = False  Application.ScreenUpdating = False  Application.Calculation = False  'セルに出力、着色。  rangeResult = aryResult 'セルに出力  For i = 1 To rangeResult.Rows.Count   For j = 1 To rangeResult.Columns.Count    If blnPaint(i, j) = True Then     rangeResult(i, j).Interior.Color = clrCompare    End If   Next j  Next i  '更新再開  Application.EnableEvents = True  Application.ScreenUpdating = True  Application.Calculation = True End Sub

961awaawa
質問者

お礼

こんばんはmathmi さん。奇しくも失敗でした。 私はM4からにしたのですが、M4の隣のN列は空けておいてO4から、コピーされたリボルビング範囲をペーストしたかったんです。 で、全セルの背景色が黄色くなってしまってました(σ≧▽≦)σ M列の1つ1つのセルの値に、その1つ1つの行上に等しい値の背景色を色付けするのが目的でもあります。ここが上手くいってなかったポイントです。 ですが、マクロしたときに、バーっと出てきたのが凄くすばらしかったです。ちょっと待ちますと一瞬で出来あがっていつもビックリさせられます。 続いてご協力お願い致します。(^^)/

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.2

>aryResult(i, cnt) = aryCompare(numRow + i - 1 + Rev.OffRow(numRev) + j - 1, numCol + Rev.OffCol(numRev) + k - 1) >i,j,kの値は1でした。 申し訳ありません。OffRowを使っているという事は、No19の方のコードでエラーが出た、との事ですね。 こちらで設定を変更してコードを走らせてもエラーは再現できませんでした。 その位置でi,j,k=1の時エラーが発生したとなると、考えられるのはnumResultに0以下の値が設定されている場合です。 一度ご確認下さい。 ……エラーの再現を考えると、どこでエラーが起こったと報告していただくよりも、SetDataプロシージャを丸ごと上げて頂くのが、一番早いかもしれません。 ***以下、特に読む必要のない余談*** ***想定できるバグとエラーが発生し得るかどうかの検討*** ・numRowが負の値→rangeCompare(1).Rowが負の値を取ることはないのでありえない。 ・numColが負の値→rangeCompare(1).Columnが負の値を取ることはないのでありえない。 ・rev.OffRowの最初の値がrangeCompareの最初の値以上→「シート範囲外と比較しようとしています。」のエラートラップに引っかかるのであり得ない。  例:rangeCompare = myWS.Range("D8:D10000")、rev.OffRow = Array(-10, -12)。8行目から10行前の値を比較しようとしている。 ・aryResultの行数が1未満→rangeCompareの行数が0はあり得ない。 ・aryResultの列数がnumResult未満→numResult+numCompare-1がnumResult未満になる、つまりnumCompareが0以下になる場合、「比較先行数もしくは列数が0以下です。」のエラートラップに引っかかるのでありえない。 ・aryCompareの行数がnumRow+rev.OffRow(0)未満→行数はrangeCompare.Count+rev.OffRowの最大値+rev.ReRow-1なのでありえない。 ・aryCompareの列数がnumCol+rev.OffCol(0)未満→列数はrangeCompareの最大の列数+{rev.OffColの最大値+rev.ResCol-1、ただし最低0}なので、rev.OffCol(0)<=rev.OffColの最大値、rev.ResCol-1>=0よりありえない。

961awaawa
質問者

お礼

こんにちはmathmiさん\(^_^)/ あのときからすっかり暑くなりましたね。熱いサポートして頂きありがとうございます。 こんなこと言うのは大変恐縮なんですが一度ストレートにソースを書いて頂きたいのです。 混乱混乱で不必要なものは省いて欲しいです。_(^^;)ゞ

関連するQ&A

  • Excel2003で動作するものがExcel97で使用できません!

    Excel20031で動作している下記VBAがExcel97では動作しません。問題のところのみ記述します。 Private Sub CommandButton2_Click() Dim fStr As String, foundCell As Range Dim i As Long, j As Long Dim x As Range, y As Range fStr = TextBox1.Text Set iSheet = iBook.Sheets(1) Set foundCell = iSheet.Range("K:K").Find(fStr, lookat:=xlWhole) これで何をしているかというと、「判定フォーム」シートから別のシートを呼び出し、判定フォームに入力した値を検索して、その行に書かれている値を判定フォームに取り込むという動作をしています。Excel2003では動作するのですが、Excel97では Set foundCell = iSheet.Range("K:K").Find(fStr, lookat:=xlWhole) のところで「RangeクラスのFindプロパティを取得できません」というエラーが出てしまいます。2003と97で何か違うところがあるのでしょうか。わかる方ぜひ教えてください。よろしくお願いいたします!!!

  • 変数で指定したセルの値を取得して計算させるには?

    sub 単月発生残高の取得() Windows("総勘定元帳データ").Activate Worksheets(1).Activate Range("a2").Activate Dim sRange As Range, eRange As Range, tRange As Range, uRange As Range Dim j As Long, k As Long Dim i As Integer For i = 3 To Range("a2").End(xlDown).Row Set sRange = Cells(i, 1) Set eRange = sRange.End(xlToRight) Set tRange = eRange.Offset(2, 0) Set uRange = tRange.Offset(0, -1) j= tRange.value k= uRange.value Range("B1").formula="=k-j" Range("A1").value="単月発生残高" Next Set sRange = Nothing Set eRange = Nothing Set tRange = Nothing Set uRange = Nothing End Sub 上記のマクロを組んでみましたが、j= tRange.value のところでエラーになります。 uRangeの値からtRangeの値を引いた値を"B1"に表示させたいのですが、うまくいきません。 どうすればいいでしょうか。

  • AS3.0ですが、下記2つのコードの違いがわかりません。。

    AS3.0ですが、下記2つのコードの違いがわかりません。。 ↓こちらのコードは undefined になるのですが、 --------------------------------- var box:Array = new Array(); for(var j=0; j<1; j++){ for(var i=0; i<10; i++){ box[j] = new Array(); box[j][i] = i+j; } } trace(box[0][0]); ----------------------------------- ↓こちらのコードは値をとることが出来ます。 ----------------------------------- var box:Array = new Array(); for(var k=0; k<10; k++){ box[k] = new Array(); } for(var j=0; j<1; j++){ for(var i=0; i<10; i++){ box[j][i] = i+j; } } trace(box[0][1]); ----------------------------------- どういう理由で、値が取れるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • Excel2007 VBA シートとユーザーフォームの値のやり取り

    1.シートからユーザーフォームを呼び出す。 2.シートからユーザーフォームへ値を渡す。 3.ユーザーフォームからシートへ値を返す。 この一連の処理を行いたいのですが。 TestSheet----------- Dim oForm As TestForm Set oForm = New TestForm oForm.SetData("渡す値") Call oForm.Show Dim Result As String 'Result = oForm.GetResult Set、GetメソッドはTestForm内に存在します。 しかし、ユーザーフォームでUnloadを行った時点でoFormが破棄されるらしく、Result = oForm.GetResultでエラーとなります。 変数とSet、Getメソッドを標準モジュールに記述すれば解決するのですが、スコープ範囲がこのシートとユーザコントロールに限定できないのでなるべく記述したくありません。 他にユーザフォームから値を受け取る方法はありませんでしょうか。

  • Excel2007VBAウォッチ式の結果について

    ●質問の主旨 ウォッチ式の「値」と「型」が、自分で作成した場合と参考書例が異なるのは、 どんな原因が考えられるでしょうか?ご存知の方ご教示願います。 ●質問の補足 下記のコードでウォッチウィンドウの操作の学習を行っています。 「ウォッチ式の追加」には以下の通り、入力しています。 ・式 i=3 ・対象 (プロシージャ)lesson3 (モジュール) Module1 ・ウォッチの種類 式がTrueのときに中断 ところがこの状態でマクロを実行し、ウォッチウィンドウを見ると 自分で作成した場合と、参考書例とで「値」と「型」の結果が異なります。 参考書通りにやっているつもりですが、なぜ結果が異なるのか さっぱり分かりません。 (自分) 値→対象範囲外 型→Empty (参考書) 値→True 型→Boolean ●コード Option Explicit Sub lesson3() Dim i As Long For i = 1 To 3 Cells(i, 1) = Worksheets(i).Name Next MsgBox "終了しました" End Sub

  • Excel2003でVLookupは使用できない?

    マクロなのですが、 Excel97で動作していたものをExcel2003で動かすとエラーが発生します。 エラー発生場所は、 KAZU = Application.VLookup("20061201", Range("範囲"), 2, True) で、Application.VLookup(20061201, Range("範囲"), 2, True)の値を調べたら エラー 2042が入っていました。 Excel2003ではVLookupが使用出来ないのでしょうか?

  • VBA 別ブックへのデータ転記

    別ブックへのデータの転記についてご教示お願いいたします。 以下、やりたいことです。 Bookの構成4種類 1.抽出用 (csvデータをコピーして、転記用Bookに移す為の加工をしており、A列に〇がついたものでO列の値(1~3)別にそれぞれのBookへ転記しようと考えています。 2.転記O列1用 3.転記O列2用 4.転記O列3用 現在のコードは以下の通りで、わからない点は大まかに2点あります。 1点目は、O列の値(1~3)の値を見てBookを開く(現在は指定のBookを開くコードになっています) 2点目は、転記用への転記の方法 例えば、抽出用のA2とA4に〇がついてO列が共に1だとすると、転記O列1用のBookを開いて、 A2のデータを以下のように。 抽出用   転記O列1用 P列の値 → A7へ C列の値 → A8へ H列の値 → A9へ I列の値 → A10へ F列の値 → E5へ L列の値 → D6へ M列の値 → D7へ K列の値 → F9へ J列の値 → D8へ A4のデータを以下のように。 抽出用  転記O列1用 P列の値 → A12へ C列の値 → A13へ H列の値 → A14へ I列の値 → A15へ F列の値 → E10へ L列の値 → D11へ M列の値 → D12へ K列の値 → F14へ J列の値 → D13へ 以上のような事がしたいのですが、 現在、勉強中の初心者で…参考書を見ながら以下のコードまでしか出来ませんでした。 このコードもめちゃくちゃなのかもしれないのでお恥ずかしいのですが… なんとかこのデータを仕上げたいと思っています。 ご教示よろしくお願いいたします。 Sub ボタン2_Click() Dim myCnc1 As String Dim myCnc2 As String Dim myFileName As String Dim sheet1 As Worksheet myFileName = "受注.csv" Set sheet1 = Worksheets(2) sheet1.Activate myCnc1 = "TEXT;" myCnc2 = ThisWorkbook.Path & "\" & myFileName With ActiveSheet.QueryTables.Add( _ Connection:=myCnc1 & myCnc2, _ Destination:=Range("A1")) .TextFilePlatform = 932 .TextFileCommaDelimiter = True .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1) .Refresh End With Columns("A:A").Insert Columns("B:B").Select Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Columns("G:G").Select Selection.TextToColumns Destination:=Range("G1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Columns("O:O").Select Selection.TextToColumns Destination:=Range("O1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Dim r As Long r = Range("E" & Rows.Count).End(xlUp).Row Columns("E:E").Insert Range("E2:E" & r).FormulaR1C1 = "=LEFT(RC[-1],10)" Range("E2:E" & r).Value = Range("E2:E" & r).Value Range("D1").Copy Range("E1") Columns("D:D").Delete Columns("H:H").NumberFormatLocal = "0_ " Columns("O:O").Insert Range("O2:O" & r).FormulaR1C1 = "=Right(RC[-1],3)" Range("O2:O" & r).Value = Range("O2:O" & r).Value Range("N1").Copy Range("O1") Range("O1") = Range("N1") + "2" Range("A1").Select Dim myRng1 As Range Dim myRng2 As Range Dim mySht As Worksheet Set myRng1 = _ ActiveSheet.Range("c1").CurrentRegion With myRng1 .AutoFilter Field:=3, Criteria1:="=J*" Set myRng2 = .SpecialCells(xlCellTypeVisible) .AutoFilter myRng2.EntireRow.Hidden = True On Error Resume Next .SpecialCells(xlCellTypeVisible).EntireRow.Delete On Error GoTo 0 myRng2.EntireRow.Hidden = False End With Set myRng1 = Nothing Set myRng2 = Nothing myFileName = ThisWorkbook.Path & "\転記O列1用.xlsm" Workbooks.Open Filename:=myFileName End Sub

  • エクセル マクロ 繰り返し処理の制御方法について

    お世話になります。エクセル初心者です。 登録用のシートから(データ数は、5000行ほど)、印刷用のシートへの転記を考えています。  下記のコードはテスト用の簡易なものですが、試行錯誤でここまではたどりついたのですが。  A列には大分類用の番号を入れてあるので、A列のセルの値が変わるまで、同じ処理を繰り返したいのですが、そのためにはどうしたらよいでしょうか。下記のコードの i と j の変数部分を連動させたい(A列の同じ値の数だけ、5行おきの転記をしたい)のですが。  Do until 構文も試してみたのですが(下記のコードでは、テストなので、「=2」のように固定にして(a)の部分に挿入してみました。)、エラーメッセージに従い、Loop の位置を(b)から(c)に変えてみたところ、無限ループに陥り、対処に困っています。  よろしくお願いします。 Sub test3() Dim i As Long Dim j As Long i = 1 '転記元の行 'Do until range("A"&i)=2 -----------------------(a) For j = 1 To 200 Step 5 '転記先の行 Range("J" & j) = Range("B" & i) Range("k" & j) = Range("C" & i) Range("L" & j) = Range("D" & i) Range("J" & j + 1) = Range("E" & i) Range("J" & j + 2) = Range("F" & i) Range("J" & j + 3) = Range("G" & i) i = i + 1 'Loop-------------------------------------------'(b) Next j 'Loop-------------------------------------------'(c) End Sub

  • Excel2007で複雑なセルコピペ。

    sheet8のセル範囲C3からセルI10000までの各セルにA~Jのいずれかがランダムに入ってます。 マクロボタンをおします。 (1)、C12の値をM3にコピペしてC12から5行戻ったC7の値をセルO3にコピペします。 (2)、M3の値とO3の値が同じならM3の背景色を黄色にしたいです。同じでないならそのままです。 マクロボタンを押します。 (3)、1つ下のC13に行き(1)と同じことをするのですが、1つ下のM4にC13の値をコピペしてC13から7行戻ったC6の値をO4にコピペしたいです。 (4)、(2)と同じようになり マクロボタンを押します (5)、1つ下のC14に行き(1)と同じことをするのですが、1つ下のM4にC14の値をコピペしてC14から9行戻ったC5の値をO5にコピペしたいです。 (6)、(2)と同じようになります。 マクロボタンを押します。 End マクロボタンを押す度にC12から1つずつ下に向かい、M3から1つずつ下に向かって値をコピペするのですが、セルOにコピペされるのは1つずつ下に向かうセルCの値から、5行戻り、7行戻り、9行戻りと戻ってはまた5行、7行、9行と戻った値を繰り返しコピペしたいです。 よろしくお願いいたします。

  • worksheetsプロパティでエラーが出る

    VBA初心者です。 vlook関数をVBAで再現したく、ネットのあれこれを参考にコードを組んでみましたがエラーが出てしまいます。 同一ブックの中にある、Aシートをデータ範囲としてBシートに値を引っ張りたいのですが、 以下のようなコードを書くと「アプリケーション定義またはオブジェクト定義のエラーです」とでます。 Set 範囲 = Sheets("A").Range(A1:D100) For i = 1 To 100 検索値 = Sheets("B").Range(i , 9) 値1 = Application.WorksheetFunction.VLookup(検索値, 範囲, 2, False) 値2 = Application.WorksheetFunction.VLookup(検索値, 範囲, 3, False) Next vlookの前にSetのところでエラーがでます。 どうやら、シートがアクティブではないから、ということのようですが、正直どのように直したらよいものかわかりません。 Sheets("シート名").Range("範囲") とすれば、事前にシートをアクティブにする必要はないと思っていたのですが、そもそも間違っていますでしょうか? どうぞご教授くださいますと幸いです。

専門家に質問してみよう