質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

1552閲覧

正規表現で先頭から続く文字0を空白へ置換した値を求める。

ad.sys.soleil

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2020/09/18 03:44

編集2020/09/18 03:46

正規表現(VBScript.RegExp)のを使って先頭から続く文字0を空白へ置換した値を求たいと思っています。
例:値    回答
1000000 --> 1000000
1111100 --> 1111100
0001234 --> 1234
0001230 --> 1230
0120012 --> 120012
9000000 --> 9000000
※末尾の桁位置を合わせる。

試した事。
Dim re As RegExp
re.Pattern = "0"
Target = "0001203"
MyStr = re.Replace(Target, Space(1))
MyStr --> 12 3
以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidezzz

2020/09/18 07:32 編集

"0000000"を与えられたら、"□□□□□□□"(すべて空白に置き換わる)になる想定ですか?それとも"□□□□□□0"(最後の0は残る)ですか?
ad.sys.soleil

2020/09/18 08:16

□□□□□□0がベストです。
guest

回答4

0

正規表現を使わない場合の一例

vba

1'7桁固定の場合 2Target = "0001203" 3Debug.Print Format(Val(Target),"@@@@@@@") 4 5'桁数可変で元の桁数に合わせる場合 6Target = "00001203" 7Debug.Print Format(Val(Target),String(Len(Target),"@")) 8 9'"00000000"の場合は、" 0" となる。 10Target = "00000000" 11Debug.Print Format(Val(Target),String(Len(Target),"@"))

投稿2020/09/18 07:47

編集2020/09/18 07:57
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/09/18 08:00

空白で埋めるのには@があったんですね。 ちょうど見たページにはなかったので出来ないのかと思いました。
ad.sys.soleil

2020/09/18 08:24

有難う御座います。参考になりました。
hatena19

2020/09/18 08:41

正規表現も便利なんですが、関数にして繰り返し呼び出すとき、RegExpオブジェクトも繰り返し生成破棄することになり、重くなりがちですので、私はできるかぎりVBAネイティブでするようにしてます。
guest

0

ベストアンサー

正規表現使わないとダメでしょうか。

以下のコードでも同様の結果は得られます。

VBA

1' 7桁固定で良いなら 2MyStr = Right(" " & Val(Target), 7) 3 4' Targetの文字数で処理する場合 5MyStr = Right(String(Len(Target), " ") & Val(Target), Len(Target))

正規表現を使った場合も書いておきます。
あまり詳しくはないので2段階になってしまいましたが、たぶんこんな感じじゃないかと思います。

VBA

1Dim re As RegExp 2Dim mc As MatchCollection 3 4Target = "0001203" 5Set re = New RegExp 6re.Pattern = "^0*" 7Set mc = re.Execute(Target) 8'MyStr = re.Replace(Target, String(Len(mc.Item(0)), " ")) 9MyStr = re.Replace(Target, String(mc.Item(0).Length, " ")) 10 11Debug.Print MyStr

投稿2020/09/18 04:14

編集2020/09/18 05:14
ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/09/18 04:27

有難う御座います。 なるほどアイディアは在るものですね使わせて頂きます。 勉学のため正規表現の方法もあれば、知りたいので回答継続して募集したいと思います。
ad.sys.soleil

2020/09/18 05:04

有難う御座います。 なるほどString(Len(mc.Item(0)), " ")が素晴らしいです。Good! 正規表現^0*部分のパターン検索文字列で凄いものの方も期待してCloseは保留して起きます。
ttyp03

2020/09/18 05:17

ちょっとだけ修正しました。 プロパティとして文字列の長さを持っていたので、わざわざLenする必要はなかったです。 個人的な見解ですが、おそらく一発で置換はできないと思います。 置換したい文字列の長さと言うのは、検索してみないとわからないものなので、Replaceのタイミングで指定することはできないからです。 もしかしたら凄腕の方が現れるかもしれませんので、待ってみる価値はあるかもしれませんが。
guest

0

VBScript

1Set re = CreateObject("VBscript.RegExp") 2re.Pattern = "^0+" 3Target = "0001203" 4myStr = re.Replace(Target, String(Len(re.Execute(Target)(0).Value), "x")) 5MsgBox myStr

投稿2020/09/18 07:21

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/09/18 08:27

有難う御座います。大変参考になりました。
guest

0

正規表現チェッカー

イメージ画像

正規表現を使うならこのサイトはご存知ですか?

VBAのことは分かりませんが正規表現^0*で先頭の0を全て検知出来ます。
あとはそれを利用した何かしらの実装をすれば良いかと。
1例として空白10文字の文字列に上記の結果を足して後ろから10文字取得すれば空白で埋められたものが作れます。

投稿2020/09/18 03:55

mjk

総合スコア303

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/09/18 04:17

有難う御座います。 ^0*で遣りましたが、0001230を変換すると □1230となり□□□1230になりませんでした。(□は空白の意味)
mjk

2020/09/18 04:34

そこはご自分で考えてください。 1.1230より前の空白を消すという正規表現の使い方と 2.1230の前を空白で埋めるという(VBAの)実装 の1の部分のみヒントになればと思い回答しました。
ad.sys.soleil

2020/09/18 04:42

有難う御座います。実は^0*は質問前に試していました。 (?=0)の先読みも遣ったのですが、上手く行かず質問とさせて頂きました。 説明不足で申し訳け御座いませんでした。
mjk

2020/09/18 05:05

いえいえ。正規表現のみで変換までするとなると私は分かりません。良い回答がつくと良いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問