• 締切済み

エクセル VBA 計算方法

計算をエクセルのマクロで行いたいたくて計算式を作ったのですが 計算のG列の項目の中に「(5.2)万」のように( )のようにがついているものが 計算の項目のなかにあり、答えが-マイナスになってしまいます。 もし( )がついてたら( )のマイナスがプラスに変換できるように組込めないですか? ちなみに式はこちらです Dim nLast As Long nLast = WorksheetFunction.Max(2, Range("J" & Rows.Count).End(xlUp).Row) Range("K2").Formula = "=VALUE(SUBSTITUTE(G2,""万"",""""))*10000+VALUE(SUBSTITUTE(H2,""円"",""""))+IF(J2=""-"",0,VALUE(SUBSTITUTE(J2,""円"","""")))" If nLast > 2 Then Range("K2").AutoFill Destination:=Range("K2:K" & nLast) End If '式を入れたいだけならここまで。値だけにしたいなら以下も必要 Range("K2:K" & nLast) = Range("K2:K" & nLast).Value

みんなの回答

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

"万"と同じように、SUBSTITUTE関数で"("と")"も消してしまえばいいのでは? Range("K2").Formula = "=VALUE(SUBSTITUTE(G2,""万"",""""))*10000+・・・・・・ ↓ Range("K2").Formula = "=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(G2,""("",""""),"")"",""""),""万"",""""))*10000+・・・・・・

mituya08
質問者

お礼

ご回答ありがとうございます。 結果はうまくいきませんでしたが、何とか他の方法で挑戦してみます。

関連するQ&A

  • VBA 計算の繰り返し

    VBAの初心者です。 ご指導お願いいたします。 G列とH列とJ列に入力されている数字をK列に合計が出るように計算式ができているのですが、 その計算式をVBAでK2からKの最後の行まで自動で入力してくれて なおかつ、K○にはG○+H○+J○の合計が入力されるように 計算式を変換する方法を教えてください。 ちなみに計算式は =VALUE(SUBSTITUTE(G2,"万",""))*10000+VALUE(SUBSTITUTE(H2,"円",""))+IF(J2="-",0,VALUE(SUBSTITUTE(J2,"円",""))) です。 ご指導お願いいたします。

  • Excel VBA

    初心者で済みません 少し困っています。よろしくお願いします。 Range("J17") = Range("F17") * Range("H17") If Range("J17").Value = "0" Then Range("J17").Value = "" End If Range("J18") = Range("F18") * Range("H18") If Range("J18").Value = "0" Then Range("J18").Value = "" End If Range("J19") = Range("F19") * Range("H19") If Range("J19").Value = "0" Then Range("J19").Value = "" End If 上記のコードを簡単にしたいのですが、どうすればいいのか、わかりません。どうか教えていただけませんでしょうか?

  • エクセルVBAのif文で同じ処理をまとめる方法

    エクセルのVBAのif文で質問です。 ・J1セルに「1302」が入っており、K1セルが空欄だった場合、K1セルに「0000」を入力する という場合、 If .Range(J1).Value = "1302" And .Range(K1).Value = "" Then  .Range(K1).Value = "'0000" End If となりますが、これがJ1=1302だけではなく2117や4101など、10種類以上の異なる値で同じ処理が必要な場合 同じ形のプログラムを羅列していく以外の書き方はありますでしょうか? if~End ifがいくつも並んでいて、うまくスッキリとまとめられないのだろうかと思い質問しました。 よろしくお願いいたします。

  • 繰返し計算の高速化の方法をご指南願います

    いつも大変お世話になり有難うございます。 VBA初心者です。 早速ですがお尋ねします。 VBAで毎回条件変えて繰返すプログラムを作りましたが終了まで数時間かかり困ってます。 プログラムの全体の流れは、 約25000個のデータをあるパラメータで計算→計算結果とその時のパラメータをセル(i、1~9)に記入→パラメータを変更→約25000個のデータをあるパラメータで計算→計算結果とその時のパラメータをセル(i+1、1~9)に記入→・・・ というものです。繰り返し回数は1万回前後です。パラメータをもとに計算する式は簡単な加減則で、文字数の都合もあり割愛いたします。 試行錯誤の結果、 1.繰り返し計算の途中にある以下の多くのセル記入文の部分 2.1列目のセルに(IF(C77=100,"測定終了",IF(C77-J77>0,"下降","上昇")))、(IF(C78=100,"測定終了",IF(C78-J78>0,"下降","上昇")))・・・の式が約25000行に渡りは入っている事 3.2~4列目に時間、測定データ1、測定データ2が約25000個ずつセルに入っている事 がネックと分かりました(ファイル容量約3MB)。 Q1、以下のセル記入方法を改善して高速化できる方法があればご指南いただけないでしょうか? なおセルへの記入はWorksheets(1)にあるグラフに使用するのと、記入されたデータを後でソートして傾向を見るためのものです。また以下Rangeの値は一回の計算毎に変化するものです。 Range("J74") = Application.WorksheetFunction.Sum(Range("J76:J30000")) Range("K74") = Application.WorksheetFunction.Sum(Range("K76:K30000")) Range("L74") = Application.WorksheetFunction.Count(Range("J76:J30000")) Range("M74") = Application.WorksheetFunction.Count(Range("K76:K30000")) Worksheets(2).Cells(i, 1).Value = i - 1 Worksheets(2).Cells(i, 2).Value = Range("J74") Worksheets(2).Cells(i, 3).Value = Range("K74") Worksheets(2).Cells(i, 4).Value = Range("L74") Worksheets(2).Cells(i, 5).Value = Range("M74") Worksheets(2).Cells(i, 6).Value = Range("B32") Worksheets(2).Cells(i, 7).Value = Range("B33") Worksheets(2).Cells(i, 8).Value = Range("B31") Worksheets(2).Cells(i, 9).Value = Range("B34") Q2、(IF(C77=100,"測定終了",IF(C77-J77>0,"下降","上昇")))・・・、の式によりプログラムが遅くならない方法は考えられるでしょうか?(一回の計算毎に”下降””上昇”の数をcountしているため計算無効にすると困ります) Q3、時間と測定データ1,2は繰返し計算のプログラムで使用する元データのため消してはまずいのですが、データの多さがプログラム速度に悪影響与えない方法はあるでしょうか? 画面更新無効などは設定しています。 winXP、excel2002、cpu2.4GHz、RAM1GB、です。 字数の都合で前後式は省略してます。すみません。 ネットや書籍で調べ、当初より多少は速度が改善されたのですが、上記問題を残し力尽きてしまいました。 質問のうち一つでも結構ですので、ご指南よろしくお願いします。

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • エクセル VBAで

    はじめまして。 VBA初心者です。 エクセルVBAで以下のことをしようとしていますが、 「型が一致しません」とエラーが出ます。 何がおかしいのでしょうか。 やろうとしていることは、以下のようなことです。 G2に入っている値を参照し>0なら、H2に”上昇”と表示。 <0なら、”下降”、=0なら”トンボ”と表示させ、G3以降も G列にデータが入っている限りそのように表示したいと思っております。 よろしくお願いいたします。 Sub 陰陽() If Range("G2:G10000").Value > 0 Then Range("H2:H10000").Value = "上昇" ElseIf Range("G2:G10000").Value < 0 Then Range("H2:H10000").Value = "下降" ElseIf Range("G2:G10000").Value = 0 Then Range("H2:H10000").Value = "トンボ" End If End Sub

  • エクセル2010、VBAや関数について

    Private Sub CommandButton1_Click() Worksheets("商品マスタ").Activate Application.Calculation = xlCalculationManual If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData ActiveWindow.ScrollRow = 3 Range("AI1:AQ4").ClearContents Range("AI1:AQ4").NumberFormatLocal = "@" Range("AJ2:AK2").Value = Range("B2:C2").Value Range("AL2:AM2").Value = Range("D2").Value Range("AO2").Value = Range("E2").Value Range("AP2").Value = Range("V2").Value Range("AQ2").Value = Range("W2").Value Range("AN2").Value = Range("D2").Value If Me.TextBox1.Value <> "" Then ' コード Range("AK3").Value = "*" & Me.TextBox1.Value End If If Me.TextBox2.Value <> "" Then ' メーカー Range("AL3").Value = "*" & Me.TextBox2.Value & "*" End If If Me.TextBox3.Value <> "" Then ' <--シリーズ Range("AM3").Value = "*" & Me.TextBox3.Value & "*" End If If Me.TextBox4.Value <> "" Then ' <--サイズ Range("AN3").Value = "*" & Me.TextBox4.Value & "*" End If If Me.TextBox5.Value <> "" Then ' 入荷日 Range("AJ3").Value = Me.TextBox5.Value End If If Me.TextBox9.Value <> "" Then ' 仕入れ先 Range("AP3").Value = Me.TextBox9.Value End If If Me.TextBox12.Value <> "" Then ' 単体価格 Range("AQ3").Value = Me.TextBox12.Value End If If Me.TextBox6.Value <> "" Then ' 在庫数 Range("AO3").Value = Me.TextBox6.Value End If If Cells(3, Columns.Count).End(xlToLeft).Column > 34 Then Range("A2:W" & Rows.Count).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=Range("AI2").CurrentRegion, Unique:=False End If Range("AI1:AQ4").ClearContents ActiveWindow.ScrollColumn = 4 Range("A2").Activate Application.Calculation = xlCalculationAutomatic End Sub このようなマクロを組んでいるのですが、とても反応が遅いのですが、 シートにはA4-AG2000にデータが入っていて、 G4-U2000には =SUMIFS('[在庫.xlsx]02'!$AD:$AD,'[在庫.xlsx]02'!$AQ:$AQ,$A421,'[在庫.xlsx]02'!$AS:$AS,$F$2,'[在庫.xlsx]02'!$AT:$AT,G$2) このような関数が入っております。 これが原因で、動作が遅くなっているのでしょうか? 行の挿入等もとても遅いのですが、 G-U列の関数をやめてVBAで転記してから、検索をかけたら、早くなるのでしょうか? G-U列には関数での表記しかわからなかったため、関数をいれております。 解決法があれば教えてください。

  • EXCELにての計算式が・・

    エクセルの計算式で困ってます。 =IF(K25<>"",(5-K25+$C26)/5*100,"") という計算式があって C26には 「-0.005」が入ります。 「5-K25」という式の答えから マイナス0.05を引きたいのですが 苦し紛れに上のような式を作りました。 これは おかしいですよね?? それと 答えが「0」になると -2E-15 といった妙な数字がセルに記入されます。 どうしてなんでしょうか??? この二つでハマってしまい 作表が止まったままではや3日・・・ どなたかお助けくださいませんでしょうか? お願いします。