• ベストアンサー

VBA 各セルの文字を処理した結果を配列に入れる

以下のコードはどう書いたら良いかお教えください。 ・セルA1からA5に対して(ユーザーが任意に選んだ範囲で、その都度変わります) ・各セルの文字に”あ”が含まれていたら、削除します(”いあう”⇒”いう”) ・各セルに対して処理した結果をC(1,1)~C(5,1)の配列に入れたい

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

  • ベストアンサー
回答No.1

・セル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

VitaminBB
質問者

補足

回答ありがとうございます。 c(1,1)・・・1なのに何個も配列が出来るのですね。不思議です。 最後のデータc(n,1)のnを調べるにはどうすればよいのでしょうか? 何度もすみませんが、よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

簡易には 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 のような具合でもできます。 添付に回答マクロの実行結果を示します。 ただし >ユーザーが任意に選んだ範囲で これをどこまで「自由に」認めるかによって,もうちょっと細工が必要な場合も考えられます。 実際にどういう状況でご相談のような事をしたいのか,現実にアナタがヤリタイ事に応じて更に工夫してください。

VitaminBB
質問者

お礼

回答ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

#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)

VitaminBB
質問者

お礼

回答ありがとうございました 理解できました。

全文を見る
すると、全ての回答が全文表示されます。
  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.2

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 これでどうですか?

VitaminBB
質問者

お礼

回答ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBA セル値の配列代入について

    Excel VBAで、セルの値を配列に代入する処理を、よくやります。 arr=Range("$A1:$C1000").value とかですね。これに関して、オートフィルタで絞り込んだ結果の可視セルだけを、配列に代入するということは、やっぱり出来ないのでしょうか。

  • VBA 任意の文字があるセルの行を削除したい

    エクセルVBAで、次のような作業をしたいのですが、記述がわかりません。 A200~A500のセルに任意の文字(たとえば「A」)が表示(一致)されていたら そのセルの行を削除する。 範囲は一定です。 よろしくお願いします。 WIndows7SP3/Excel2013

  • エクセルVBAでセル内にある文字列のみを配列に入れたい

    VBAでセルに以下のような文字列が入っています。 '6AL847A987_ シングルクオーテーションと7の後のスペースを除いた箇所だけを配列に取り込みたいのですが、何かいい方法はないでしょうか? ちなみに 6AL847A987 だけの場合もあり、スペースがない場合もあります。 すみませんが、よろしくお願いします。

  • VBAで2次元配列を使ってセル検索がしたいです。

    VBAを使って開発をしています。 セル検索なのですが、検索範囲のセルに対し、 C言語のような配列を作って格納してまず1列検索し、 対象が見つかったらアクションを起こして、 次の行へ移ってまた検索…を繰り返すということが したいです。 しかし範囲指定でRangeを使う場合、 "A1:A12"と指定しなければならないようで、 これでは固定入力になってしまい、"A1:A12"の次に "B1:B12"、"C1:C12"…と検索を続けられなさそうです。 なにかいい方法はないものでしょうか?

  • セル内の文字列に複雑な処理をしたい

    セルの中の複数の異なる文字列を以下のように処理したいのですが、Excelの標準の文字列操作の関数で試行錯誤してみたのですが、どうもうまくできませんでしたので、ご存知の方がいらっしゃいましたらご教授ください。VBAで処理しないとできないかもしれませんがよろしくお願いします。 あるリストのC列に備考欄が設けてあり、次のようなデータが入っています。 4/30 みかんを買った(強制改行して) 5/1 りんごを売った 5/2 ぶどうを食べた 5/5 すいかを買った このセルを調べて、 (1) セル内に"みかん"と"りんご"という文字列があったら、これを取り出して、右隣のセルに表示           (結果)⇒ みかん りんご (2) セル内に"みかん"と"りんご"という文字列があったら、これを"A","B"に置き換えて、右隣のセルに表示          (結果)⇒ A B (3) セル内の数値データと"を食べた"、"を買った"、"を売った"を取り除いて、右隣のセルに表示          (結果) ⇒ みかん りんご ぶどう すいか   (4) セル内に"か"を含む文字列があったら個数に関係なく"A"に置換して右隣のセルに表示             (結果) ⇒ A   すべて取り出したい文字列(上の例ではみかん、りんご)や置換したい文字列(A、B)以外の文字列は全てクリアして表示しないようにします。少し複雑ですが、やり方をご存知の方がいらっしゃいましたら、お教えください。

  • エクセル VBA セル範囲を指定

    functionプロシージャを作ろうとしてます。いわゆるユーザ定義関数です。 エクセルの関数でSUMが用意されており、SUM(セル範囲)のように書けば合計を返します。 同じようにセル範囲の指定を受けて計算結果を返すfunctionを作りたいのです。 function example(セル範囲 As double,・・・) As double 任意の範囲を指定して、その値を使って計算したいのです。 ・セル範囲の書き方というか、フォーマットの書き方 ・プロシージャ内で計算に使うために配列に読み込む方法

  • Excel VBA 配列処理後の動作について

    Dim v As Variant             1.配列を使用して処理    v = (範囲)    処理      Range("A200").End(xlUp).Select    2.セルをA列最終行に移動 Do  If Selection = Range("A2") Then    処理    Exit Do  Else    処理    Selection.End(xlUp).Select  End if Loop 上記のように記述すると、配列処理の後の動作がうまくいきません。 セルは最終行に移動しているのですが、Do Loop では Selection は常に セルA2 として 認識されてしまいます。 If文の Selection を Selection.Address とするとうまく動作することを偶然見つけたので、 そちらで処理していくことにしましたが、なぜSelection のみでは期待通りに動作しないのでしょう? どなたかご教示いただけないでしょうか。 よろしくお願いいたします。

  • 文字の配列の置き換えなのですが、

    おはようございます。 文字の配列の置き換えなのですが、 セルB1=1 C1=2 D1=3 といった順に横に文字が入ってます。 この文字をA5にB1を、A6にC1を A7にD1を入れたいのですが、 どうづればいいのでしょうか?

  • Excel VBAで入力を行ったセルの取得方法

    質問失礼します。 当方、現在VBAを使用して入力された文字の内容を判別して結果を返すというものを作っているのですが、制作の過程でユーザーが任意の場所に入力を行ったセルを取得する処理が必要になりました。 セルの範囲に関係なく、ユーザーが入力を行ったセルを取得するにはどうしたら良いのでしょうか? お恥ずかしながらVBAに関する知識が乏しいため皆さんの力を借りたく質問させていただきました。 回答お待ちしています。

  • 配列への文字列の追加ってどうやって追加するの?

    配列に文字列をいれたいのですが char a[100]; sprintf(a,"AB"); と書くと a[0]にAが a[1]にBが a[2]に\0が格納されますよね。 「配列に一度格納された文字列に新たな文字列を追加」したいのです。 つまり この\0を上書きしてa[2]から CD を追加し、結果 a[0]にAが a[1]にBが a[2]にCが a[3]にDが a[4]に\0が 格納されているようにしたいのです。 半角英数だったらできるのですが全角だとどうやるのでしょうか。 やりたい事は以下のようなものです。 "あい"を1度目の処理で配列に文字列を格納し、次の処理で"うえ"を追加し、 配列aをprintfするとき「あいうえ」が出力されるようにしたいのです。 どなたか教えてください(>_<

スキャン、印刷ができない
このQ&Aのポイント
  • 昨日まで使えていたんですが朝印刷しようとしたら使えなくスキャンもできなく「接続してください」とエラーが出ます。
  • アンインストールをして新規インストールしている最中製品選択の項目で「製品が見つかりませんでした」と表示されます。
  • パソコンもしくはスマートフォンのOSはWindows10で接続はUSBケーブルです。関連するソフト・アプリは不明で電話回線はひかり回線です。
回答を見る

専門家に質問してみよう