今だけ人気マンガ100円レンタル特集♪

こんにちは。 EXCEL2016使用してます。
配列でデータを処理しようとしているのですが
行き詰ってしまったので質問させてください。
(データが大量にあり、next構文で何度か固まってしまったため、配列での処理希望です)

sheet1
17行目~最終行まで
D列~最終列まで
データに空白有
D列~最終列までを【-】で繋げ、繋げたものに重複なし

sheet2
B列5行目にsheet1のデータを貼り付けたい

エラー:オーバーフロー
myR = Range(.Cells(17, 3), .Cells(lasR, lasC)) 'ここでオーバーフロー

↑で必ずオーバーフローかアプリケーション定義のエラーになってしまいます。
(いろいろいじって、どのエラーが出たのかわからなくなってしまい、でも毎回ここで止まります)
型はLongにしているし、原因がさっぱりわからず、、、
どうかアドバイスよろしくお願いします。


Sub test()

Dim myDic1 As Object
Dim i As Long, j As Long
Dim myStr As String, buf As String, myWord As String, ws As Worksheet
Dim myKey1, myR, myAry
Set myDic1 = CreateObject("Scripting.Dictionary")
Set ws = Sheets("sheet2")

lastRow = Cells(Rows.Count, "B").End(xlUp).Row '最終行
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column '最終列

myR = Range(Cells(17, "C"), Cells(lasR, lasC)) 'ここでオーバーフロー

For i = 1 To UBound(myR, 1)
For j = 1 To lasC
myStr = myStr & myR(i, j) & "_"
Next j

buf = Left(myStr, Len(myStr) - 1)
myDic1.Add buf, ""
myStr = ""
Next i

myKey1 = myDic1.Keys


'格納したキーをsheet2に吐き出す
myR = Range(ws.Cells(5, "B"), ws.Cells(UBound(myKey1) + 2, lastCol))

For i = 0 To UBound(myKey1)
myAry = Split(myKey1(i), "_")
For j = 0 To UBound(myAry)
myR(i + 1, j + 1) = myAry(j)
Next j
Next i

Range(ws.Cells(5, "B"), ws.Cells(UBound(myKey1) + 2, lastCol)) = myR

End Sub

A 回答 (6件)

あと多分ですけど。



For i = 1 To UBound(myR, 1)
For j = 1 To lasC
myStr = myStr & myR(i, j) & "_"
Next j

buf = Left(myStr, Len(myStr) - 1)
myDic1.Add buf, ""

myStr = ""
Next i

ここって

For i = 1 To UBound(myR, 1)
myStr = Join(Application.Index(myR, i, 0), "_")

'★buf = Left(myStr, Len(myStr) - 1)
myDic1.Add myStr, ""

myStr = ""
Next i

とIndex・Join関数を用いた方が楽かも。
    • good
    • 0
この回答へのお礼

ありがとう

ベストアンサーはとても迷いましたが
私の拙い質問何度もアドバイスしていただき、
ありがとうございました!
教えてもらったことを試しながらやってみようと思います。

お礼日時:2020/06/19 19:35

こんにちは



>今度はmyStrでインデックスが有効範囲にありませんと表示されてしまいました...。
すでに指摘はされていますが・・・
変数の問題などがクリアされているという仮定の上ですが、エラーはmyStrではなくて、myRの添え字で発生しているのでしょう。

その前の代入文をみれば、myRの行数は「最終行番号ー16」、列数は「最終列番号ー2」になるはずです。
この配列に対して、「For j = 1 To lasC」の範囲でインデックスを指定すれば、上記の列数の「最終列番号ー2」<「最終列番号」となっているので、当然のことながら「インデックスが範囲外」ということになります。

添え字 j の範囲を、直接「最終列番号ー2」とするか、i と同様にUBOUNDを用いて指定すれば範囲外となることは無くなると考えられます。
    • good
    • 0
この回答へのお礼

ありがとう

最終列-2とは気付きませんでしたが、
これなら間違いなさそうです。
アドバイスありがとうございました!

お礼日時:2020/06/19 19:32

No.3のお礼について



まず現在のコードの提示が欲しい所でしたね。
どのように修正されたのかがわかりますし。

とにかく質問文においては

>For j = 1 To lasC

ここも変数名がおかしいですけど、その上の

>For i = 1 To UBound(myR, 1)

をご存知であれば二次元配列の列方向のインデックス最大値を用い、

For j = 1 To UBound(myR, 2) ' 2 とは列方向を意味します。

としておいた方がわかりやすいかも。
    • good
    • 0

Cells(行、列)の列は数値(1,2,3・・・)若しくは英字("A","B","C")のどちらでも構いません。



lastRow = Cells(Rows.Count, "B").End(xlUp).Row '最終行
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column '最終列

myR = Range(Cells(17, "C"), Cells(lasR, lasC)) 'ここでオーバーフロー

変数の宣言がないのも気になりますが、そもそも取得した変数名とCellsに使っている変数名が違うでしょ。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
初歩的なミスで恥ずかしいです。
オーバーフローについては解決したのですが、
今度はmyStrでインデックスが有効範囲にありませんと表示されてしまいました...。

お礼日時:2020/06/17 23:49

No.1です。

誤記がありました。訂正します。

誤)Cellsの列指定を"B"とか”C”とかで書いていますが、正しくは"1”, "2"です。
正)Cellsの列指定を"B"とか”C”とかで書いていますが、正しくは"2”, "3"です。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
書き方は過去ログを参考にさせていただきました。

お礼日時:2020/06/17 23:46

気になる箇所が2つあります。



①Cellsの書き方
 Cellsの列指定を"B"とか”C”とかで書いていますが、正しくは"1”, "2"です。

②最終列の求め方
 lastCol = Cells(1, Columns.Count).End(xlToLeft).Column '最終列
 と書かれていますが、冒頭で「17行目~最終行まで」と説明されています。
 上記コードは1行目の最終列を求めるコードですので正しくは
 lastCol = Cells(17, Columns.Count).End(xlToLeft).Column '最終列
 になります。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング