dポイントプレゼントキャンペーン実施中!

Excelで数字のみを2倍3倍にする方法ってありますか?
C20H40とかを数字のみ2倍してC40H80としたいです。
ご回答よろしくお願いします。

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

  • みなさんご回答いただきありがとうございます!!
    質問内容が曖昧だったので、補足させていただきます。元素分析で出てきた値を2倍3倍にしたいと考えております。
    ですので、C28H40N4Cl2…(でたらめです)などのように

    ・元素記号が一文字または二文字になる。
    ・CとClのように同じアルファベットが被ることもある。
    ・数字の桁数もバラバラ。
    ・どこで終わるかが決まっていない。

    などの特徴があります。
    正直難し過ぎて、僕にはお手上げでした。そもそも可能なのか分からないのですが、もしやり方がわかる方がいましたら教えていただきたいです。

    エクセルの関数ではなく、マクロVBAでも少しは勉強したことがあるので、大丈夫です!

    よろしくお願いします。

      補足日時:2021/05/01 08:32

A 回答 (8件)

倍数を変更できる方が宜しいですよね?


必要なら変数: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
    • good
    • 1
この回答へのお礼

解決しました

ご回答いただきありがとうございました!
大変助かりました!

お礼日時:2021/05/02 09:24

こんにちは



すでに回答は出ていますけれど・・・

雰囲気から、こちらの方が使いやすいかと思い、ユーザー定義関数にしてみました。

使い方は、元の文字列が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
    • good
    • 2

分子式では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

如何でしょうか?
    • good
    • 0

》 C20H40とかを数字のみ2倍してC40H80としたい


C99H99とかは、C198H198としたいと?
参考までに、それを希望する業種は何ですか?
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。
質問に至らない点がございましたので、補足させていただきました。
業種は有機化学系の研究職で、組成式を扱いたいと考えております。

お礼日時:2021/05/01 08:42

文字と数値の混合はダメってご意見もありますが、回答した物は昔『組成式』を分割する際に使用したコードの改良版です。


混合している事を否定してもそう言う値(式)が実際に存在するのですから、仕方ないと思いました。(個人の見解です)
    • good
    • 0

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

かな?
    • good
    • 1
この回答へのお礼

拙い質問だったのですが、組成式であることを汲み取っていただけたことに感動しております!
組成式がどこまで続くか分からないのですが、その場合でも子のコードで計算機可能でしょうか??

お礼日時:2021/05/01 08:37

同じ桁数ならまだしも桁上がりとかすると面倒かもだし、"20H40"みたいなのでも大変かも。


VBなら楽なのかもです。(VBAではなく。と言うか以前回答が付いている。)
    • good
    • 0

できないことは無いけど凄く面倒。


1,000個や10,000個程度なら一つずつ手作業でやった方が早いと思いますよ。

・・・

文字列から、文字列と数字を切り離す。
数字に掛け算する。
文字列と数字を結合する。
の手順になります。

質問の例では、文字列を4に分け、数値に対して2倍または3倍するわけです。
掛け算はとても簡単。
空いているセルに「2」と入力してからそのセルをコピーして、
掛け算したい範囲を選択したら「形式を指定して貼り付け」から「乗算」を選んで貼り付けるだけで範囲全体の数値を2倍にできます。

…ということで、この手順を再現するよう、数式やマクロを作成すれば良い。
要は、自分で仕組みを作りましょうって事です。


・・・余談・・・

値を計算させたい場合、数値を入力するセルに文字列を含まないようにするのは鉄則です。
ですので、文字列を含む数値を計算させるには面倒な手順を踏まなければならない。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。自動的に文字列と数字が組み合わさった結果が出てきてしまうんです…

お礼日時:2021/05/01 08:39

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

このQ&Aを見た人はこんなQ&Aも見ています