• 締切済み

エクセルのマクロ 型が一致しません

どなたか教えて下さい。 Sub 血量計算( ) Dim N As Integer Dim TOTAL As Single Dim BLD As Single N = 1 TOTAL = 0 BLD = 0 While Mid(ActiveCell, N, 1) <> Error BLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100 TOTAL = TOTAL + BLD N = N + 2 Wend MsgBox TOTAL & " %" End Sub BLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100 ここが黄色くなり、型が違うと出てしまいます。 わかる方いらっしゃいましたら宜しくお願いします。

みんなの回答

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.7

 BLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100 >ここが黄色くなり、型が違うと出てしまいます。 回答No.5で説明が不十分のようですから補完します。 Mid(ActiveCell,N,1)はアクティブセルの値の先頭からN番目の1文字を指していますので数字(文字としての数字)でなければデータの型が違うので計算できません。 アクティブセルの模擬データを提示して頂ければ更に詳しく説明できます。 例えばA1セルがアクティブで値が文字列のA123であるときはN=1のときに次の計算でエラーになります。 Mid("A123",1,1) → "A" = 0.5 ^ "A" * 100 → "A"が数字では無いのでデータの型が違うというエラー しかし、A1セルの値が123Aのときは次のようになり、エラーが起らない。 Mid("123A",1,1) → "1" = 0.5 ^ "1" * 100 → "1"は数字なので暗黙の了解事項で数値化して計算できる。 ∴ = 0.5 ^ 1 * 100 → 0.5 * 100 → 50 Mid("123A",3,1) → "3"では同様に = 0.5 ^ 3 * 100 → 0.125 * 100 → 12.5 左からN番目の文字が数字でないときに起るエラーなのでエラー処理をどうするかによって対策が異なります。 尚、While ~ Wendのループは途中で抜け難いのでDo While ~ Loopを使われた方が良いでしょう。 下記のコードはNの値がActiveCellの文字列長の範囲でDoループを繰り返し、N番目が数字以外の文字のときループから抜け出すようにしてあります。 参考になれば幸いです。 Sub 血量計算() Dim N As Integer Dim TOTAL As Single Dim BLD As Single N = 1 TOTAL = 0 BLD = 0 Do While Len(ActiveCell.Value) >= N If Asc(Mid(ActiveCell, N, 1)) < 48 Or Asc(Mid(ActiveCell, N, 1)) > 57 Then Exit Do BLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100 TOTAL = TOTAL + BLD N = N + 2 Loop MsgBox TOTAL & " %" End Sub

全文を見る
すると、全ての回答が全文表示されます。
noname#231195
noname#231195
回答No.6

#4です。 あるいはここでエラー値を評価できないってことかも。 While Mid(ActiveCell, N, 1) <> Error 最初の行に(Subの次の行) On Error Resume Next と書いておくと走るかもしれないです。 あるいは、ActiveCellの中身の長さはLen関数でとることができるのですから、わざわざエラーを出させてループを抜けるより、For-Nextで回数を決めてループを回した方がいいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.5

回答No.3は勘違いでした。 質問のコードを実行する前にアクティブセルの値を確認してください。 値が数値または数字のみの文字列であることを確認してください。 数字のみの文字列は暗黙の了解事項で計算式の中で数値化されますのでエラーになりません。 但し、目的の計算結果が正しい値であるか否かはチェックしていません。

全文を見る
すると、全ての回答が全文表示されます。
noname#231195
noname#231195
回答No.4

BLD = 0.5 ^ CSng(Mid(ActiveCell, N, 1)) * 100 としてみたら走りませんか? Mid関数全体をCSng関数でくくっています。これは文字列を単精度浮動小数点型の数値に変換する関数です。 たぶん、その血量のデータがコンマかなにかで区切られた文字列なのでしょうが、全部一桁の数字なんでしょうね? もし、上の変更でもエラーが出るようでしたら Debug.Print N & ": " & Mid(ActiveCell, N, 1) という一行をBLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100の前に書いて、どのNでエラーが出て、どんな値を処理しようとしているのか調べてみるといいです。 Debug.Pringについてはこちらをご覧になるといいでしょう。 http://excelvba.pc-users.net/fol8/8_1.html

全文を見る
すると、全ての回答が全文表示されます。
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.3

BLD = 0.5 ^ Mid(ActiveCell, N, 1) * 100        ↓ BLD = Int(0.5 ^ Mid(ActiveCell, N, 1) * 100) または Dim BLD As Single     ↓ Dim BLD As Variant

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (720/1490)
回答No.2

ActiveCellに文字が入っていませんか? プログラムを見ると、奇数桁だけ取り出して、計算しています。 Mid(ActiveCell, N, 1) が数字でなければ計算できません。 ActiveCellの奇数桁が文字だととエラーになります。 ActiveCellが正しいところに置かれているか、ActiveCellの中身が数字が、確認してください。

全文を見る
すると、全ての回答が全文表示されます。
noname#232800
noname#232800
回答No.1

MIDだと文字列ですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA Excel

    分散が既知の場合の区間推定のプログラムを考えています。 次のマクロを実行するとエラーが出ます。 エラー:"1004" 引数の数の誤りがあります。 どこの行がエラーなのか分かりません。どこなのでしょうか? また、プログラムでおかしいところがあったら、教えてください。 Sub Calculate(DataRange As String, OutRange As String, a As Single) Dim RanData As Range Dim Ave As Single, n As Single, n1 As Integer, n2 As Integer Dim Std As Single, s As Single, p As Single, z As Single, aa As Single Dim b As Single, kukan As Single, Max As Single, Min As Single Set RanData = Range(DataRange) n1 = RanData.Rows.Count n2 = RanData.Columns.Count n = n1 + n2 Ave = Application.Average(RanData) Std = Application.StDev(RanData) s = Std * Std p = (1 + a) / 2 z = Application.NormInv(0, 1) b = Sqr(s / n) kukan = z * b Max = Ave + kukan Min = Ave - kukan aa = a * 100 Range(OutRange).Select Call output("信頼度", aa) Call output("標本数", n) Call output("平均", Ave) Call output("標準偏差", Std) Call output("分散", s) Call output("信頼区間", kukan) Call output("信頼上限", Max) Call output("信頼下限", Min) End Sub Private Sub output(name As String, x As Single) ActiveCell.Range("A1") = name ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.Range("A1") = x ActiveCell.Offset(1, -1).Range("A1").Select End Sub Sub Prob() UserForm1.Show End Sub

  • 型が一致しません

    下記はセルが0の時、行全体を表示しないにするようにするVBAですが、型が一致しませんとエラーになります、どこを直せばいいのですか。 Dim I As Integer Sub Macro4() For I = 4 To 76 If Cells(I, 8) = 0 Then Rows("I:I").Select Selection.EntireRow.Hidden = True End If Next I End Sub

  • マクロでの次の実行マクロへの記述

    下記のマクロを記述しました。 一つのマクロ処理を終わらせて、次のマクロ(例:test)を動かしたいのですが何処に 記述したら良いかわかりません。 教えてください。 Sub Macro1() Dim i As Integer Dim buff As String i = 2 While 1 If Range("B" & i).Value = "" Then End End If buff = Range("B" & i).Value Range("B" & i).Value = Left(buff, 7) + " " + Mid(buff, 8, 5) + " " + Right(buff, 6) i = i + 1 Wend   Call test →ここに仮に記述したのですが、testのマクロに行きません。 End Sub 以上

  • 階乗のマクロ

    階乗のマクロを作りたいのですが、全然できません。どこを変えたらいいのか教えて下さい。ちなみに今こうなっています。 ------------------------------------------------ Sub exam5() Dim intA As Integer Dim intB As Integer Dim intC As Integer intA = Application.InputBox("数値を入力してください。") intB = (intA - 1) intC = (intA) * (intB) MsgBox (intC) End Sub Function kaijou(intA As Integer, intB As Integer) As Integer kaijou = intA * intB End Function ------------------------------------------------ どうかお願いします。

  • エクセルマクロ セル内の値の抜き出しと入力の値との

    すみません、ハマっております。 下記マクロにて、A2セル内にある(例)「111-22222-5555-666-1」の中のと入力した5555とのマッチングのマクロを作っているのですが、どうしてもA2値がemptyになってしまいうまくマッチングできません。どうしたらよいでしょうか?お力お貸しください。 Private Sub CommandButton1_Click() Unload 番号入力 Dim OdrNum As String If TextBox1.Value = "" Then Exit Sub Else OdrNum = TextBox1.Value While Mid(A2, 11, 4) <> OdrNum '該当番号の欄になるまで不要行削除 If Mid(A2, 11, 4) = "" Then MsgBox "該当番号はありませんでした。" Exit Sub Else End If Rows("2:2").Select Selection.Delete Shift:=xlUp Wend MsgBox "処理終了" End If End Sub

  • エクセルのマクロについて

    下記は、A列3行の7文字目~10文字と B列5行~文字のある最後の行までの範囲の左から1文字目~4文字 に相違がある場合 MsgBox i & “行目” を出す。 というマクロなのですが、『B列5行~文字のある最後の行までの範囲』の中でも『空白のセルに関してはMsgBox不要』というふうに付加えたいのですがどのようにすればよいでしょうか。 Sub Macro1() Dim i As Long Dim sOrgText As String Dim ltotal As Long With ActiveSheet sOrgText = Mid(.Cells(3, 1), 7, 4) ltotal = .Cells(65536, 2).End(xlUp).Row For i = 5 To ltotal If Not Mid(.Cells(i, 2), 1, 4) = sOrgText Then MsgBox i & "行目" End If Next i End With End Sub

  • Excelのマクロについて

    文字列から数値だけを抽出するマクロを見つけたのですが、抽出するデータを選択してから実行しなければなりませんでした。 抽出するデータはAセル以下にしかないので、データを選択しないでも実行できるようにするにはどうしたら良いのでしょうか? 宜しくお願いします。 以下見つけたマクロです。  Sub test()  Dim mydata As String  Dim c As Range  Dim i As Integer  For Each c In Selection   mydata = ""  For i = 1 To Len(c)   If Mid(c, i, 1) >= 0 And Mid(c, i, 1) <= 9 Then   mydata = mydata & Mid(c, i, 1)    End If   Next   c.Offset(0, 1) = mydata   Next  End Sub

  • エクセル マクロ 特定の文字の色を変更

    Private Sub CommandButton6_Click() MsgBox Mid(ActiveCell, InStrRev(ActiveCell, "⇒") + 1) End Sub このようなマクロがあり 選択しているセルの最後から⇒まで部分をMsgboxで表示してくれますが この文字の色を変更したい場合はどうすればいいでしょうか?

  • VBE Excelのマクロがわかりません(IF関数)

    エクセルのマクロがわかりません。教えてください 問題は5人の簿記の点数を入力し5人の合計点・最高点・最低点を表示するプログラムを作成する。というものです。 Sub test() Dim boki as integer Dim sum as integer Dim max as integer Dim min as integer For A = 1 to 5 boki = InputBoxx("簿記の点数入力") goukei = goukei + boki ?????? Next A Msgbox"5人の合計点は"&A Msgbox"5人の最高点は"&A Msgbox"5人の最低点は"&A End Sub IF関数を使って??の部分を作るようなのですが、いまいちよく分からないので教えてください。 bokiは簿記 sumは合計 maxは最高 minは最低のことを現してます。

  • エクセルマクロでEnd Subが見つからないとでる

    Excelのマクロ記述についての質問です.  以下のマクロはエクセルにない関数「IMMULT」をあらかじめ定義するためのものです.(技術計算のHPより入手し,コピーして貼り付けたものです)  これを実行すると「End Subがみつからない」と出てしまいます.End Subは記述しているのになぜでしょうか,どなたか解決策を教えて頂けませんか! Sub 関数定義() Public Function IMMULT(a As Range, b As Range) As Variant Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer Dim r As Integer, c As Integer Dim cr As Integer, cc As Integer Dim n As Integer Dim mm() As Variant r1 = a.Rows.Count r2 = b.Rows.Count c1 = a.Columns.Count c2 = b.Columns.Count If (c1 = r2) Then nn = c1 Else Exit Function End If cr = r1 cc = c2 ReDim mm(1 To cr, 1 To cc) For r = 1 To cr For c = 1 To cc mm(r, c) = 0 For n = 1 To nn mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c))) Next Next Next IMMULT = mm End Sub

専門家に質問してみよう