
No.7ベストアンサー
- 回答日時:
倍数を変更できる方が宜しいですよね?
必要なら変数:n に対してInputBoxとか使ってみても。(今回は除外ですが。)
Sub megu_3()
Dim myReg As Object
Dim match
Dim st2 As String, st1
Dim n As Integer
Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "[A-Z][a-z]?(\d*)"
myReg.Global = True
n = 3 '倍数
For Each st1 In Array("C2ClCo3MgH6O3", "CoMgFeCl2") '適当
st2 = ""
If myReg.Test(st1) Then
For Each match In myReg.Execute(st1)
If Len(match.SubMatches(0)) > 0 Then
st2 = st2 & Replace(match.Value, match.SubMatches(0), CStr(Val(match.SubMatches(0)) * n))
Else
st2 = st2 & match.Value & CStr(n)
End If
Next
Debug.Print st1, " => ", st2
End If
Next
Set myReg = Nothing
End Sub
No.8
- 回答日時:
こんにちは
すでに回答は出ていますけれど・・・
雰囲気から、こちらの方が使いやすいかと思い、ユーザー定義関数にしてみました。
使い方は、元の文字列がA1セルにあるとして、
=decMult(A1, 指定倍数)
のように通常の関数と同様に入力します。
指定倍数:乗算したい数値(2とか3など。セル値で指定しても可)
事前に、以下のコードを標準モジュールにコピペしておきます。
Function decMult(ByVal s As String, ByVal n As Long) As String
Dim re, mc, i, f
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
re.Global = True
Set mc = re.Execute(s)
If mc.Count > 0 Then
For i = mc.Count - 1 To 0 Step -1
f = mc(i).firstIndex
s = Left(s, f) & mc(i).Value * n & Mid(s, f + mc(i).Length + 1)
Next i
End If
decMult = s
End Function
No.6
- 回答日時:
分子式では1の場合は数値は記載されないので一部改良。
しかし10年以上前の質問を思い出してしまいました。
Sub megu_2()
Dim myReg As Object
Dim match
Dim st2 As String, st1
Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "[A-Z][a-z]?(\d*)"
myReg.Global = True
For Each st1 In Array("C2ClCo3MgH6O3", "CoMgFeCl2") '適当
st2 = ""
If myReg.Test(st1) Then
For Each match In myReg.Execute(st1)
If Len(match.SubMatches(0)) > 0 Then
st2 = st2 & Replace(match.Value, match.SubMatches(0), CStr(Val(match.SubMatches(0)) * 2))
Else
st2 = st2 & match.Value & "2"
End If
Next
Debug.Print st1, " => ", st2
End If
Next
Set myReg = Nothing
End Sub
結果:
C2ClCo3MgH6O3 => C4Cl2Co6Mg2H12O6
CoMgFeCl2 => Co2Mg2Fe2Cl4
如何でしょうか?

No.5
- 回答日時:
》 C20H40とかを数字のみ2倍してC40H80としたい
C99H99とかは、C198H198としたいと?
参考までに、それを希望する業種は何ですか?
この回答へのお礼
お礼日時:2021/05/01 08:42
ご回答いただきありがとうございます。
質問に至らない点がございましたので、補足させていただきました。
業種は有機化学系の研究職で、組成式を扱いたいと考えております。
No.4
- 回答日時:
文字と数値の混合はダメってご意見もありますが、回答した物は昔『組成式』を分割する際に使用したコードの改良版です。
混合している事を否定してもそう言う値(式)が実際に存在するのですから、仕方ないと思いました。(個人の見解です)
No.3
- 回答日時:
VBAなら
Sub megu()
Dim myReg As Object
Dim match
Dim st1 As String, st2 As String
Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "[A-Za-z]+?(\d+)"
myReg.Global = True
st1 = "C20H40Mg75"
If myReg.Test(st1) Then
For Each match In myReg.Execute(st1)
st2 = st2 & Replace(match.Value, match.SubMatches(0), CStr(Val(match.SubMatches(0)) * 2))
Next
Debug.Print st1, " => ", st2
End If
Set myReg = Nothing
End Sub
結果:
C20H40Mg75 => C40H80Mg150
かな?
この回答へのお礼
お礼日時:2021/05/01 08:37
拙い質問だったのですが、組成式であることを汲み取っていただけたことに感動しております!
組成式がどこまで続くか分からないのですが、その場合でも子のコードで計算機可能でしょうか??
No.2
- 回答日時:
同じ桁数ならまだしも桁上がりとかすると面倒かもだし、"20H40"みたいなのでも大変かも。
VBなら楽なのかもです。(VBAではなく。と言うか以前回答が付いている。)
No.1
- 回答日時:
できないことは無いけど凄く面倒。
1,000個や10,000個程度なら一つずつ手作業でやった方が早いと思いますよ。
・・・
文字列から、文字列と数字を切り離す。
数字に掛け算する。
文字列と数字を結合する。
の手順になります。
質問の例では、文字列を4に分け、数値に対して2倍または3倍するわけです。
掛け算はとても簡単。
空いているセルに「2」と入力してからそのセルをコピーして、
掛け算したい範囲を選択したら「形式を指定して貼り付け」から「乗算」を選んで貼り付けるだけで範囲全体の数値を2倍にできます。
…ということで、この手順を再現するよう、数式やマクロを作成すれば良い。
要は、自分で仕組みを作りましょうって事です。
・・・余談・・・
値を計算させたい場合、数値を入力するセルに文字列を含まないようにするのは鉄則です。
ですので、文字列を含む数値を計算させるには面倒な手順を踏まなければならない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで数字のみを2倍3倍にする...
-
PHPで<a>タグ内からURLと文字を...
-
、"(ダブルクォーテーション)...
-
VBAを使ってHTMLソースから特定...
-
正規表現での英字+ハイフンの...
-
2つのif 構文が1つしか動作し...
-
正規表現で、半角大文字と半角...
-
VBAのコマンドボタンの文字列の...
-
エクセルのCOUNTIFが正しくカウ...
-
COBOLの改行
-
メッセージボックスで1025文字...
-
エスケープ文字の復帰(¥r)と...
-
PPT ファイルの文字カウント=...
-
ソースコードの1行が長いとき...
-
Excel関数「COUNTIF」で”文字”...
-
グレープシティのSPREAD...
-
C++で空Enterの入力を判...
-
テキストボックスに改行を含む...
-
変数の中の改行コードをBRタグ...
-
カンマの含まれる文字列の数値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
、"(ダブルクォーテーション)...
-
正規表現で、半角大文字と半角...
-
PHPで変数から1行目だけを取得...
-
PHPで<a>タグ内からURLと文字を...
-
携帯アドレスの正規表現
-
VBAを使ってHTMLソースから特定...
-
switchの大量分岐の高速化
-
正規表現について
-
preg_matchでエラーが出ます。
-
電話番号のチェック ハイフン...
-
変数に指定文字列が含まれると...
-
1ファイルから項目を正規表現で...
-
正規表現で「0」のみ抽出
-
複雑な/による文字列の分割につ...
-
サイトが移動しました(301)が...
-
Smartyで部分一致
-
PHPで あるフォルダ内の、特定...
-
PHPの正規表現について
-
Excelで数字のみを2倍3倍にする...
-
正規表現 先頭一桁をマッチさせ...
おすすめ情報
みなさんご回答いただきありがとうございます!!
質問内容が曖昧だったので、補足させていただきます。元素分析で出てきた値を2倍3倍にしたいと考えております。
ですので、C28H40N4Cl2…(でたらめです)などのように
・元素記号が一文字または二文字になる。
・CとClのように同じアルファベットが被ることもある。
・数字の桁数もバラバラ。
・どこで終わるかが決まっていない。
などの特徴があります。
正直難し過ぎて、僕にはお手上げでした。そもそも可能なのか分からないのですが、もしやり方がわかる方がいましたら教えていただきたいです。
エクセルの関数ではなく、マクロVBAでも少しは勉強したことがあるので、大丈夫です!
よろしくお願いします。