- ベストアンサー
Excelのマクロ教えてください
初めまして。 以下のようなマクロが欲しいのですが、知識不足のため、どうしたらよのかわからず困っております。 ウェブで色々と調べてやってみましたが、期待どおりの結果を得られませんでした。 どなたかお教えいただけたら幸いです。 行いたいのは、例えば、 セルA1に文字列『1. abc』が入っているとき、先頭の番号『1』の部分だけ取り出し (または . 以下を除いて)、セルA1の内容を数字型の『1』に書き換える という動作です。 複数のセルをドラッグして選択し、マクロのショートカットで一発変換 できたら…と思っております。 変換したい部分のセルの内容はすべて、『1. abc』のように、文字列で 「1~7の数字」、「半角の.」、「半角スペース」、「英単語」 の順になっています。 簡単なことなのかもしれませんが、自分にはさっぱりでした… どなたか回答をお願いいたします。m(_ _)m
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 練習レベルだとしたら、 For Each c in Selection c.Value =Left$(c.Value,1) Next という方法が一番よいのかな。 >変換したい部分のセルの内容はすべて、『1. abc』のように、文字列で >「1~7の数字」、「半角の.」、「半角スペース」、「英単語」 >の順になっています。 "[1-7]. [A-z][A-z][A-z]*" とすれば、ある程度表現してみるかもしれませんが、厳密には、この方法ではだめですね。Like 演算子には、それほどの表現力がありませんから、"abc" の次の文字の制限がありません。VBAだけの範囲では、それを確保できません。正規表現の力が必要です。 >簡単なことなのかもしれませんが、自分にはさっぱりでした… VBAだけの範囲では、ご質問自体は、かなり難しいですね。ただ、今回、この質問には関係ないけれども、難しい方法は、別の質問者さんのように無視されても叶わないでから、とりあえず、その先はやめておきます。(立て続けに二度されると、さすがに同様の質問は、めげますね。) ショートカットの登録の方法などは、割愛しておきます。 '------------------------------------ '標準モジュールが良いです。 Sub Test1() Dim c As Variant For Each c In Selection If c.Value Like "[1-7]. [A-z][A-z][A-z]*" Then c.Value = Val(c.Value) End If Next c End Sub
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 #4の回答者です。 >提示していただいたコードでテストしたときは、特にエラーなどなく動作しましたが、あまり推奨されない書き方だということなのでしょうか。 それは、ご質問の精度が、どのぐらいまで求められているか分からないからです。 >変換したい部分のセルの内容はすべて、『1. abc』のように、文字列で >「1~7の数字」、「半角の.」、「半角スペース」、「英単語」 >の順になっています。 という条件には、私の書いた内容には、多少の食い違いがあるということです。 例えば、1. abcdあ(英単語ではない), 1.abc(コンマが全角), 8. aab(最初が、8で、スペースが全角)という条件は、除外例として挙げられたりしたら、もう、私のマクロでは、そのままでは間違いですね。「1~7の数字」、「半角の.」、「半角スペース」、「英単語」 この条件のどれかが、該当していない場合は、変換をしないと考えたら、そんなに簡単ではありません。 単に、数字だけを取り出すなら、Val 関数を使えばよいものの、消しては困るものがあったら、大変なのです。私は、あくまでも、忠実に質問に答えようとするのですが、そう思うことで、空回りも往々にしてあるということなのです。 >簡単なことなのかもしれませんが、自分にはさっぱりでした… そして、簡単と思えることが、時には、非常に難しい問題が含まれていたりします。そこで、私自身、手抜きをしたりして、後々に、別のところで読みを間違って、ミスを出すことも、またあるということなのです。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 ちょっと気になったので、遅れ馳せながら コードだけですが。 For Each rngX in Selection rngX.Value=Val(rngX.Value) Next とかで、どうですか? 却って入力ミスにも対応し易いんじゃないかな? 他にも色々あるだろうけど、 「For Each ~ Next」ループや 「文字列から先頭の数値を返す」Val()関数などは、 重要な基本だと思うので。 一応、条件として以下。 ・セル範囲を選択中であること ・セルの書式が標準であること
お礼
こんにちわ^^ 回答ありがとうございます。 貴重なご意見ありがとうございました。 今回の質問内容は急に言われた仕事でのことでして、Excelのマクロは使ったことがないし、 VBの知識もないという初心者状態でしたので、このようなアドバイスは本当にありがたいです。 cj_mover様のご意見考慮しながら、良いコードの書き方を勉強していきたいと思います。 ありがとうございました^^
- HowOver
- ベストアンサー率30% (17/56)
=left(a1,search(".",a1)-1) これでどう?
お礼
回答ありがとうございます^^ 私が意図しているものとは少々違うところもあるようでしたが、参考にさせていただきました。 ご意見ありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
なぜマクロが必要なのでしょう。 =VALUE(LEFT(A1,1) で別のセルに変換すれば済む話だと思います。 マクロならとりあえずこんな感じでしょう。結合セルは考慮していません。 Sub Macro3() Dim r As Range, ptr As Integer If TypeName(Selection) = "Range" Then For Each r In Selection ptr = InStr(r.Value, ".") If ptr > 0 Then If IsNumeric(Left(r.Value, ptr - 1)) Then r.Value = Val(Left(r.Value, ptr - 1)) End If End If Next r End If
お礼
回答ありがとうございます^^ お礼が遅くなってしまってすみません。 おっしゃる通り、 =VALUE(LEFT(A1,1) を用いて変換すればよい話でもあるのですが、今回はアンケート結果の分析を 行おうとしていまして;; 何十項目あるアンケート数百件の結果がいくつかのファイルに分かれており、 今後も同様の作業を数回行う可能性があるなぁ…と思ったので、そのつど 上記式を用いるよりもマクロ作っちゃったほうが効率いいかなっと考えた 次第です > < ご丁寧にありがとうございます。 zap35様のコードで思い通りの変換をすることができました。 本当にありがとうございました。
- fred2000
- ベストアンサー率30% (6/20)
Sub test() Dim c As Range For Each c In Selection c.Value = Left(c, 1) Next End Sub 急いでいるようなので回答しますが、私はあまり詳しくないので違ったらすみません。
お礼
お早い回答ありがとうございます^^ お礼が遅くなりすいませんでした。 fred2000様のコードで、期待通りの変換を行うことができました。 この短いコードがどうなっているのか…今の私にはさっぱりですが、 大変すばらしいと思います。 ありがとうございました。助かりました。
お礼
こんばんは^^ 回答ありがとうございます。 なんともご丁寧に回答していただきまして、大変勉強になりました。 提示していただいたコードでテストしたときは、特にエラーなどなく動作 しましたが、あまり推奨されない書き方だということなのでしょうか。 皆様のご意見を参考にしつつ、勉強していきたいと思います。 ありがとうございました。