電子書籍の厳選無料作品が豊富!

いつもお世話になっております
下記のコードを見つけたのです。
Msgboxに表示させるコードですが、
range("A1") に2005-5/23が入力されているとして
A1からA31まであり日付はすべて違います。

range("B1") 2005 range("C1") 5 range("D1") 23
と表示させたいです。
わかる方おしえてくれませんでしょうか


Dim objRegExp, objMatches, x
Dim str
str = "2005-5/23"
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "(\d+)"
objRegExp.Global = True
Set objMatches = objRegExp.Execute(str)
For Each x In objMatches
MsgBox x
Next

質問者からの補足コメント

  • 申し訳ございません
    Excelの標準モジュールに
    書いています。
    画像添付しました。
    お忙しいところ恐縮ですが
    よろしくお願いいたします。

    「VBScript Cellの書き出し」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2020/05/29 14:55
  • どう思う?

    最初のは下記でしたが
    "2005-5/23"
    2020/5/1です。
    また、

    For Each R In Range("A2", Cells(Rows.Count, "A").End(xlUp))

    R.Offset(, 1) = Year(R)

    Next
    でもいけますがよろしくお願いいたします。

      補足日時:2020/05/29 15:01

A 回答 (4件)

.Test プロパティで取得して Split で区切って放り込むってのもある。



Sub megu()
Dim R As Range

For Each R In Range("A2", Cells(Rows.Count, "A").End(xlUp))

With R.Offset(, 1).Resize(, 3)
.Value = Split(R.Text, "/")
.Value = .Value
End With

Next

End Sub


どうしても正規表現なら、

Sub megu()
Dim myReg As Object
Dim r As Range, i As Integer
Dim Matches

Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "\d+"
myReg.Global = True

For Each r In Range("A2", Cells(Rows.Count, "A").End(xlUp))
For i = 0 To myReg.Execute(r.Text).Count - 1

With r.Offset(, i + 1)
.Value = myReg.Execute(r.Text)(i)
.Value = .Value
End With

Next
Next

Set myReg = Nothing
End Sub

こんな感じ?
    • good
    • 0
この回答へのお礼

いつも有難うございます。
With R.Offset(, 1).Resize(, 3)
.Value = Split(R.Text, "/")
.Value = .Value
End With
とても素晴らしいです。
For Each R In Range("A2", Cells(Rows.Count, "A").End(xlUp))

R.Offset(, 1) = Year(R)

Next
わたしが書くとどうしてもアナログ的になってしまいます。
あ--なんとかしたいです。
ありがとうございました。

お礼日時:2020/05/29 16:48

No.3です。



>Dim Matches

これはいらなかったね。
あとどちらもセルの値としては数値にしちゃってま~す。
    • good
    • 0

No1です



>Excelの標準モジュールに~~
ということはVBSではなくVBAということですよね?

ご提示の表を見ると、多分A列の値はシリアル値になっているのではないかと推測しますが、その場合は正規表現で行うよりも、そのまま YEAR() などで年月日を取得した方が遥かに簡単です。
例えば、
 For Each c In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
  c.Offset(, 1).Value = Year(c.Value)
  c.Offset(, 2).Value = Month(c.Value)
  c.Offset(, 3).Value = Day(c.Value)
 Next c

VBAでなくともシート関数で同様のことが可能です。

一方で、ご提示の様に正規表現を用いたければ、一旦、文字列に変換するために
 Format(Range().Value, "yyyy/m/d")
などのよう、「/」形式の日付文字列に変換してから行う必要があります。
あるいは、ご提示の図のようにセルの表示書式が「/」形式で設定されているのなら、
 Range().Text
で、表示のままの文字列形式の値を取得できますので、そちらを用いることも可能でしょう。

(多分違うとは思いますが)A列の値が文字列になっている場合は、上記のような変換は必要なく(変換しようとすると却ってエラーになります)、そのままのセルの値を正規表現にかければよいことになります。
また、文字列操作で求める場合であっても、今回のように「/」で分割するだけであれば、Split関数を用いて分割する方が簡単でしょう。
https://docs.microsoft.com/ja-jp/office/vba/lang …
    • good
    • 0
この回答へのお礼

有難うございました。
参考に致します。

お礼日時:2020/05/29 16:45

こんにちは



>VBScript Cellの書き出し
って、タイトルにありますが、「 .VBS」ファイルを直接実行している環境でしょうか?

ご質問文にはいきなり「range("A1")に~」などと記載がありますが、上記の環境なら、まず「エクセルへのインスタンスを生成してファイルを開く」ことから始めないと・・・
(このあたりの情報がまったく欠落しているので、これ以上はなんとも…)

エクセル操作の例としては、こんな感じでしょうか
https://garafu.blogspot.com/2018/09/vbscript-exc …

エクセルへアクセスできれば、あとはVBAとほぼ同じ操作でできるはずです。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!