• 締切済み

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

どなたか教えて下さい。 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/8249)
回答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/8249)
回答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/8249)
回答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
  • ベストアンサー率47% (774/1620)
回答No.2

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

noname#232800
noname#232800
回答No.1

MIDだと文字列ですね。

関連するQ&A