ここから本文です

先ほど解決しましたhttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1...

nfu********さん

2019/5/1206:46:36

先ほど解決しましたhttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q122076126...ですが
マクロを全行一気に検索しないで

12151行目~50000行まで
50001行目~100000行まで
100001行目から残りの最終行まで
3段階に分けてマクロが実行できるようなことは可能ですか

閲覧数:
60
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

taihenda****さん

2019/5/1208:28:07

添付図のようなサンプル50万行でtri********さんのをテストすると8、9秒ぐらいで終わってしまいますね。エラーになるようなことはないですがテストのためシートコピーしてシートが10枚ぐらいになると「リソースが足りない」の警告が出ます。ブック全体の文字数ですかね、もし他にも大量の文字のあるシートがあるなら別のブックに分離した方がいいのかもしれません。
3つに分けるということは15万行ぐらいですか?
5万行なら1,2秒で終わります。これでもダメなら何か別の原因があるのだと思います。



Sub B列C列大文字に1()
'12151~50000
Dim i As Long, j As Long, n As Long, R, D
R = Range("B12151:C50000").Value
n = UBound(R)
ReDim D(1 To n, 1 To 2)
For i = 1 To n
For j = 1 To 2
D(i, j) = StrConv(R(i, j), vbWide)
Next
Next
Range("B12151").Resize(n, 2) = D
End Sub


Sub B列C列大文字に2()
'50001~100000
Dim i As Long, j As Long, n As Long, R, D
R = Range("B50001:C100000").Value
n = UBound(R)
ReDim D(1 To n, 1 To 2)
For i = 1 To n
For j = 1 To 2
D(i, j) = StrConv(R(i, j), vbWide)
Next
Next
Range("B50001").Resize(n, 2) = D
End Sub


Sub B列C列大文字に3()
'100001~
Dim i As Long, j As Long, n As Long, R, D
R = Range("B100001", Cells(Rows.Count, 3).End(xlUp)).Value
n = UBound(R)
ReDim D(1 To n, 1 To 2)
For i = 1 To n
For j = 1 To 2
D(i, j) = StrConv(R(i, j), vbWide)
Next
Next
Range("B100001").Resize(n, 2) = D
End Sub



こんな感じでしょうか?

添付図のようなサンプル50万行でtri********さんのをテストすると8、9秒ぐらいで終わってしまいますね。エ...

  • 質問者

    nfu********さん

    2019/5/1210:26:53

    どうもありがとうございます。
    50000行でもとてつもなく駄目で
    例に習って10000行→5000行づつに減らしても駄目でした
    そこで1000行づつにしてみたらOKの様です(数回しか試していませんが)。分割しないで一括で1000行づつを繰り返すようなマクロは組めますでしょうか?

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/5/13 06:06:15

この度のご回答誠にありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

tri********さん

2019/5/1211:09:10

可能です。
・全角変換するプロセスを別のプロシージャ(strConvert)に分けます。
・メインプロシージャ(B列C列大文字に)から検索範囲を指定して変換プロシージャを呼び出しています。(Call strConvert(開始行,終了行)
・2回目以降の呼び出しにIfステートメントを使っているのは、最終行が開始行以下のときにエラーとなるのを防ぐためです。
・開始行、終了行を変えて呼び出し回数を増減させれば、何段階でも分けることができます。
※この2つのプロシージャは同じモジュールに書いてください。

Sub B列C列大文字に()
Dim endRowC As Long '//C列の最終行
endRowC = Cells(Rows.Count, 3).End(xlUp).Row
Call strConvert(12151, 50000)
If endRowC >= 50001 Then
Call strConvert(50001, 100000)
Else
Exit Sub
End If
If endRowC >= 100001 Then
Call strConvert(100001, endRowC)
Else
Exit Sub
End If
End Sub

'//指定範囲のセルを全角に変換
Private Sub strConvert(startRow As Long, endRow As Long)
Dim TargetRng As Range '//指定範囲のセル
Dim rng As Range '//個別のセル
Dim arrRng() As Variant '//指定セル範囲を格納する配列変数
'//指定範囲のセルを配列化
Set TargetRng = Range(Cells(startRow, 2), Cells(endRow, 3))
arrRng = TargetRng
'//配列の値を全角文字に変換
For Each rng In TargetRng
arrRng(rng.Row - (startRow - 1), rng.Column - 1) = _
StrConv(rng.Value, vbWide)
Next rng
'//指定範囲のセルの値を全角変換後の配列値に書き換え
TargetRng.Value = arrRng
End Sub

実際試してみましたが、最終行が150000以下なら効果あると思います。シートの最終行付近(もう一桁上)までデータがあるとやはり3回目が重いです。その場合、段階を増やせばいいと思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる