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としたいと?
参考までに、それを希望する業種は何ですか?
ご回答いただきありがとうございます。
質問に至らない点がございましたので、補足させていただきました。
業種は有機化学系の研究職で、組成式を扱いたいと考えております。
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
かな?
拙い質問だったのですが、組成式であることを汲み取っていただけたことに感動しております!
組成式がどこまで続くか分からないのですが、その場合でも子のコードで計算機可能でしょうか??
No.2
- 回答日時:
同じ桁数ならまだしも桁上がりとかすると面倒かもだし、"20H40"みたいなのでも大変かも。
VBなら楽なのかもです。(VBAではなく。と言うか以前回答が付いている。)
No.1
- 回答日時:
できないことは無いけど凄く面倒。
1,000個や10,000個程度なら一つずつ手作業でやった方が早いと思いますよ。
・・・
文字列から、文字列と数字を切り離す。
数字に掛け算する。
文字列と数字を結合する。
の手順になります。
質問の例では、文字列を4に分け、数値に対して2倍または3倍するわけです。
掛け算はとても簡単。
空いているセルに「2」と入力してからそのセルをコピーして、
掛け算したい範囲を選択したら「形式を指定して貼り付け」から「乗算」を選んで貼り付けるだけで範囲全体の数値を2倍にできます。
…ということで、この手順を再現するよう、数式やマクロを作成すれば良い。
要は、自分で仕組みを作りましょうって事です。
・・・余談・・・
値を計算させたい場合、数値を入力するセルに文字列を含まないようにするのは鉄則です。
ですので、文字列を含む数値を計算させるには面倒な手順を踏まなければならない。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- Gmail Gメールの表示件数 Gメールのバッチの表示件数がおかしいです 例えば実際に届いてるメールが10件なの 1 2022/04/14 01:25
- 数学 数学の解法について こんばんは。最近数学の問題を解いています。証明問題を解いたのですが、解答とアプロ 4 2022/09/11 23:22
- 数学 中学2年生です。素朴な疑問なのですが1.5という数字は3の倍数なのでしょうか? 3×(1/2)だから 9 2023/03/03 15:14
- 数学 【 数A 順列 】 問題 6個の数字0,1,2,3,4,5を使ってできる次の ような整数は何個あるか 1 2022/06/19 12:18
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Excel(エクセル) Excelで、行に複数の数字が入力されているセルが複数の列存在し、行を跨いでセル内の数値を並び替える 5 2022/06/17 18:03
- 数学 最小公倍数と最大公約数の求め方で画像のような計算法があったのですが、理解できません。 なぜ2つ数24 4 2022/04/10 13:37
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
エクセルで入力した数字を倍にするには?
Excel(エクセル)
-
エクセルで数字をセルに入れて倍数にしたい
Excel(エクセル)
-
Excelであるセルの中の数字を2倍にし、また別のセルと2倍にしたセルを足すにはどのようにしたらよい
その他(パソコン・スマホ・電化製品)
-
-
4
エクセルで1と入力すると〇倍 2と入力すると△倍
Excel(エクセル)
-
5
エクセルで全部の数字を3倍したい
Excel(エクセル)
-
6
エクセルで複数の条件で掛け算する関数
インターネットビジネス
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトバンクのUSERAGENTうまく...
-
、"(ダブルクォーテーション)...
-
正規表現で「0」のみ抽出
-
電話番号のチェック ハイフン...
-
VBAを使ってHTMLソースから特定...
-
ピリオドは「文字列連結演算子...
-
PHPで変数から1行目だけを取得...
-
正規表現パターンの記入方法に...
-
PHPで<a>タグ内からURLと文字を...
-
phpでhtmlソースを解析し、文字...
-
正規表現の書き方について
-
VBAのコマンドボタンの文字列の...
-
REGEXREPLACE関数について、
-
ダブルコーテーション(
-
文字の入力で横バー上段、中断...
-
エスケープ文字の復帰(¥r)と...
-
ソースコードの1行が長いとき...
-
文の改行
-
C++で空Enterの入力を判...
-
COBOLの改行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
preg_matchでエラーが出ます。
-
VBAを使ってHTMLソースから特定...
-
Excelで数字のみを2倍3倍にする...
-
PHPで変数から1行目だけを取得...
-
正規表現でシングルクォーテー...
-
、"(ダブルクォーテーション)...
-
正規表現で「0」のみ抽出
-
住所から特定の文字列、数値を...
-
PHPで あるフォルダ内の、特定...
-
phpでhtmlソースを解析し、文字...
-
PHPで<a>タグ内からURLと文字を...
-
正規表現で特定のHTMLタグのク...
-
PHPの正規表現で住所を分けるに...
-
Smartyを使用した、テンプレー...
-
PHPによるIPアドレスマッチ
-
正規表現で、半角大文字と半角...
-
php 正規表現で(ただし○○は除...
-
PHPメールフォーム URLと半角...
-
「半角数字」と「+」を許可する...
-
preg_matchでのマッチが正しく...
おすすめ情報
みなさんご回答いただきありがとうございます!!
質問内容が曖昧だったので、補足させていただきます。元素分析で出てきた値を2倍3倍にしたいと考えております。
ですので、C28H40N4Cl2…(でたらめです)などのように
・元素記号が一文字または二文字になる。
・CとClのように同じアルファベットが被ることもある。
・数字の桁数もバラバラ。
・どこで終わるかが決まっていない。
などの特徴があります。
正直難し過ぎて、僕にはお手上げでした。そもそも可能なのか分からないのですが、もしやり方がわかる方がいましたら教えていただきたいです。
エクセルの関数ではなく、マクロVBAでも少しは勉強したことがあるので、大丈夫です!
よろしくお願いします。