• ベストアンサー

エクセルのマクロのつくり方について質問です

次のようなものをつくりたいのですが、よくわからずに困っています 例)A列に次のような型式が入力してあります U100-00-1000 U120-01-0001 D100-00-0002 I120-03-0001 これを、Uで始まり、間の2桁が00の場合は、B列に1を、それ以外はB列に2を入れる条件式を入れたいのです 上の例で言えば、U100-00-1000には1で、それ以外は2を、B列に入れる ただし、A列の型式は、何行になるかわからないので、Loopを使う必要があると思います Do…Loopを、Ifで挟んだらよいかと思うのですが、セルをどのように指定してよいのかがよくわかっていません どうかご指導お願いいたします

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

  • ベストアンサー
  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.2

こんな感じでしょうか? Range("A1").Select  '開始位置をA1にする Do Until Selection.Value = "" 'A列が空白になるまで繰り返す   If Left(Selection.Vlaue, 1) = "U" And Mid(Selection.Value, 6,2) = "00" Then     Selection.Cells(1, 2).Value = 1  '右隣のセル(B)に1を   Else     Selection.Cells(1, 2).Value = 2  '右隣のセル(B)に1を   End If   Selection.Cells(2,1).Select  '処理対象を一つしたのセルに Loop 実際はマクロよB列にりワークシート関数で =IF(AND(LEFT(A1,1)="U",MID(A1,6,2) = "00"),1,2) などのほうがよいかと思います。

dengennao
質問者

お礼

回答ありがとうございます マクロって、いろんなやり方があるのですね! さっそくやってみます 関数でもいいんですね でも、会社でどのブックでも使いたい場合は、やはりマクロのほうが いいのかしら? あ~、これで今夜は眠れて、明日元気に会社にいけます ありがとうございました

dengennao
質問者

補足

やってみましたが、 If Left(Selection.Vlaue, 1) = "U" And Mid(Selection.Value, 6, 2) = "00" Then で、デバックしてしまいました なぜだめなのか、自分で解決できませんでした…

その他の回答 (3)

  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.4

No.2です。 記述に間違いがありました。大変申し訳ありません。 > If Left(Selection.Vlaue, 1) = "U" And Mid(Selection.Value, 6, 2) = "00" Then ここの Left(Selection.Vlaue, 1) の部分ですが Left(Selectioin.Value, 1)の間違いです。そのままコピペしたのであれば訂正してください。

dengennao
質問者

お礼

こちらこそ、気がつかなくてすみませんでした おかげさまで、無事動きました 会社でこんな方法があるんだよって披露しましたら 「シンプルですごい」と評判でした Selection.Cells(2, 1).Select で、セルを指定しているのに 次々と次のセルに移動するのですね! ありがとうございました

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 --------------------------------- 初級マクロ(Like 演算子を使う方法) 'どこでも登録可能 Sub Test1() Dim i As Long   i = 1 '初期値   With ActiveSheet   Do Until .Cells(i, 1).Value = ""     If .Cells(i, 1).Value Like "U###-00-####" Then       .Cells(i, 2).Value = 1     Else       .Cells(i, 2).Value = 2     End If    i = i + 1   Loop   End With End Sub -------------------------------- 正規表現を使ったマクロ(複雑な内容の場合) '標準モジュール Sub Test2()   Dim c As Range   Dim buf As String   Application.ScreenUpdating = False   With CreateObject("VBScript.RegExp")     '正規表現パターン     .Pattern = "U\d{3}\-(\d{2})-\d+"     .Global = False     For Each c In Range("A1", Range("A65536").End(xlUp))       If VarType(c) = vbString Then         If .Test(StrConv(c.Value, vbNarrow)) Then            buf = .Execute(StrConv(c.Value, vbNarrow)) _           .Item(0).SubMatches(0)         End If         If buf = "00" Then           c.Offset(, 1).Value = 1         Else           c.Offset(, 1).Value = 2         End If       End If       buf = ""     Next   End With   Application.ScreenUpdating = True End Sub

dengennao
質問者

お礼

2パターン書いていただいて、ありがとうございました まだ、初級でいっぱいいっぱいですが 上級も理解できるよう、地道に頑張りたいと思います  自分で作った時にうまく動かなかったのは、With ActiveSheet の指定が抜けていたからかしら?  "U###-00-####" と表すこともできるんだ、と勉強になりました ありがとうございました

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

例えば、 Dim r As Range Dim x As Variant Set rs = Range("A1", Cells(Rows.Count, 1).End(xlUp)) For Each r In rs x = Split(r.Value, "-") r.Offset(, 1).Value = IIf(InStr(x(0), "U"), IIf(InStr(x(1), "00"), 1, 2), 2) Next こうゆうことですか?

dengennao
質問者

お礼

回答をありがとうございます …正直なところ、括弧がたくさんある時点で ???になってしまった、勉強不足の私です なので、そういうことです!って、元気に返事ができません もう少しがんばって勉強します

関連するQ&A