- ベストアンサー
VBA 各セルの文字を処理した結果を配列に入れる
以下のコードはどう書いたら良いかお教えください。 ・セルA1からA5に対して(ユーザーが任意に選んだ範囲で、その都度変わります) ・各セルの文字に”あ”が含まれていたら、削除します(”いあう”⇒”いう”) ・各セルに対して処理した結果をC(1,1)~C(5,1)の配列に入れたい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
・セルA1からA5に対して(ユーザーが任意に選んだ範囲で、その都度変わります) 現在選択中の物を取得するselectionを使ってください。 Dim r as Range Set r=Selection ・各セルの文字に”あ”が含まれていたら、削除します(”いあう”⇒”いう”) rangeオブジェクトのreplaceメソッドを使ってください。 Dim r as Range Set r=Selection Call r.Replace("あ", "") ・各セルに対して処理した結果をC(1,1)~C(5,1)の配列に入れたい Option Base 1 を最初に宣言すると、配列の始まりは1になりますので、あとはVariantの配列変数に代入すれば配列で取得できます。ただ、選択セルが1セルの場合はエラーになりますのでエラー処理が必要です。 Dim r as Range Dim c() As Variant Set r=Selection Call r.Replace("あ", "") On Error Resume Next c = r.Value If Err.Number <> 0 Then ReDim c(1, 1) c(1, 1) = r.Value End If On Error GoTo 0
その他の回答 (3)
- keithin
- ベストアンサー率66% (5278/7941)
簡易には sub macro1() dim a as variant dim i as long a = selection.value for i = 1 to ubound(a) a(i, 1) = replace(a(i, 1), "あ", "") next i end sub のような具合でもできます。 添付に回答マクロの実行結果を示します。 ただし >ユーザーが任意に選んだ範囲で これをどこまで「自由に」認めるかによって,もうちょっと細工が必要な場合も考えられます。 実際にどういう状況でご相談のような事をしたいのか,現実にアナタがヤリタイ事に応じて更に工夫してください。
お礼
回答ありがとうございました
- kanemoto_s
- ベストアンサー率45% (112/244)
#1です。 >c(1,1)・・・1なのに何個も配列が出来るのですね。不思議です。 ちょっと違います。 r.value の型は2セル以上で2次元配列、1セルの時は文字列となり、処理を統一するためにわざわざc(1,1)を作って文字列を入れる必要があります。 #1のコード以外にも redim c(r.rows.count,r.columns.count) for i=1 to r.rows.count for j=1 to r.columns.count c(i,j)=r(i,j).value next j next i のようにしてもよいのですが、選択範囲がかなり大きくなると時間がかかるようになるので#1のコードの方がお薦めです。 >最後のデータc(n,1)のnを調べるにはどうすればよいのでしょうか? 配列cのn次元目の最大要素は Ubound(c,n) を使います。この場合、n=1で Ubound(c,1) もしくは r.rows.count でも同じ結果が得られます。 配列の最小は1ですが以下でもOK Lbound(c,1)
お礼
回答ありがとうございました 理解できました。
- Chiquilin
- ベストアンサー率30% (94/306)
Dim c As Variant, x As Range, key As String Dim cnt As Long, i As Long key = "あ" cnt = Selection.Cells.Count ReDim c(1 To cnt, 1) For Each x In Selection i = i + 1 c(i, 1) = Replace(x.Value, key, "") Next x これでどうですか?
お礼
回答ありがとうございました
補足
回答ありがとうございます。 c(1,1)・・・1なのに何個も配列が出来るのですね。不思議です。 最後のデータc(n,1)のnを調べるにはどうすればよいのでしょうか? 何度もすみませんが、よろしくお願いいたします。