Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
型が一致しません。が解決できません。
投稿日時: 17/12/01 16:07:45
投稿者: HIDETOTO

こんにちわ
型が一致しません。というエラーが出て解決できません。
 
具体的には、テキストファイルを開いて計算をして元のテキストに出た値を毎行足して新しいテキストファイルを作ろうと思っています。
 
解決していただけると幸いです。
 
 
Sub test()
 
     Dim buf As String, a As Long, i As Long, j As Long, k As Long, l As Long, m As Long, n As Long, rowsData As Long, var As Variant, tmp As Variant
      
    Open "C:" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            a = a + 1
            Cells(a, 1) = buf
        Loop
     
rowsData = Cells(Rows.Count, 1).End(xlUp).Row
 
 
     
    For j = 5 To rowsData
        tmp = Split(Cells(j, 1), " ")
    For l = 0 To UBound(tmp)
        Cells(j, l + 2) = tmp(l)
    Next l
    Next j
     
    For i = 2 To rowsData
         
       Cells(i, 2) = Replace(Cells(i, 2), "A", "")
       Cells(i, 3) = Replace(Cells(i, 3), "B", "")
       Cells(i, 4) = Replace(Cells(i, 4), "C", "")
         
    Next i
     
    For k = 5 To rowsData
    Cells(k, 5) = Cells(k - 1, 5) + (Sqr((Cells(k, 2) - Cells(k - 1, 2)) ^ 2 + (Cells(k, 3) - Cells(k - 1, 3)) ^ 2 + (Cells(k, 4) - Cells(k - 1, 4)) ^ 2)) * 0.02
 
  ↑この部分が型が一致しません。とでているようです。
  ここ以下の確認はできておりません。
 
    Next k
     
    For m = 5 To rowsData
         
       Cells(i, 5) = Replace(Cells(i, 2), Cells(i, 2), "D" & Cells(i, 2))
    Next m
     
    For n = 5 To rowsData
     
    var(0) = Cells(n, 1)
    var(1) = Cells(n, 5)
    Cells(n, 6) = Join(var)
    Next n
     
    Close
End Sub
 
皆さまよろしくお願い致します。

回答
投稿日時: 17/12/01 16:33:12
投稿者: hatch315
メールを送信

入力データの内容をみないと何とも言えないですが、
 
Cells(i, 2) = Replace(Cells(i, 2), "A", "")
Cells(i, 3) = Replace(Cells(i, 3), "B", "")
Cells(i, 4) = Replace(Cells(i, 4), "C", "")
 
文字の置き換えができていないのでは。
例えば、ABC以外の文字がある 小文字のabcがあるとかです。

回答
投稿日時: 17/12/01 16:34:56
投稿者: もこな2

全部読んだわけではないですが、tmp(Variant型)にテキストデータを Splitで区切って渡して、配列にしてやっただけなので、中身って数値になってるんでしょうか・・・・

投稿日時: 17/12/01 16:41:52
投稿者: HIDETOTO

hatch315さん
もこな2さん
ありがとうございます。
 
入力データの内容はこんな感じです。
A-31.283 B11.564 C5.774
A-32.637 B8.119 C5.845
A-33.632 B4.553 C5.914
A-34.245 B0.899 C5.983
A-34.333 B-0.024 C6.
A-34.205 B-1.87 C6.035
A-33.972 B-3.703 C6.069
A-33.639 B-5.518 C6.104
A-32.681 B-9.079 C6.172
A-31.356 B-12.525 C6.242
A-29.705 B-15.801 C6.311
A-27.74 B-18.906 C6.381
A-25.5 B-21.806 C6.45
A-22.991 B-24.498 C6.52
 
小数点は今回関係ありませんよね?
ABCをreplaceで消しても数字にはならないということでしょうか?

回答
投稿日時: 17/12/01 16:53:37
投稿者: hatch315
メールを送信

Dimで定義した var As Variant が配列になっていないと思います。
 
エラーは  var(0) = Cells(n, 1) の記述で発生します。
 

回答
投稿日時: 17/12/01 16:56:35
投稿者: hatch315
メールを送信

Variantの定義では、自動で配列にはならないみたいですね。

回答
投稿日時: 17/12/01 17:03:43
投稿者: hatch315
メールを送信

あと
 
     For m = 5 To rowsData
          
         Cells(i, 5) = Replace(Cells(i, 2), Cells(i, 2), "D" & Cells(i, 2))
     Next m
  
上記記述だと セルに"D"が付きません
For を "m" で行っているので Cells(i,5)などは "i"ではなく"m"では。

回答
投稿日時: 17/12/01 17:22:22
投稿者: もこな2

見づらかったのでコードをちょっと編集
 

Sub test()

     Dim buf As String
     Dim a As Long, i As Long, j As Long, k As Long, l As Long, m As Long, n As Long, rowsData As Long
     Dim var As Variant, tmp As Variant

    '「C:\テスト.txt」をInputモードで開いて1行ずつ読み込んで、アクティブシートの1行目から順に書き込む
    Open "C:\テスト.txt" For Input As #1 '@ファイル名は適当に足しました
        Do Until EOF(1)
            Line Input #1, buf
            a = a + 1
            Cells(a, 1) = buf
        Loop

    '書き込んだ行を取得してシート最終行から上方向に検索して、
    'データのある最終列を取得するして「rowsData」に格納する
    rowsData = Cells(Rows.Count, 1).End(xlUp).Row 'A ここ 「rowsData = a 」でもいいのでは?

    'アクティブシートのA列、5〜「rowsData」行までセルの値を、以下のようにループ処理
        'Split関数を使って配列に直した後、同じ行のB列以降に、配列の内容を出力
    For j = 5 To rowsData
        tmp = Split(Cells(j, 1), " ")
        For l = 0 To UBound(tmp)
            Cells(j, l + 2) = tmp(l)
        Next l
    Next j

     'アクティブシートの2行目以降に、以下をループ処理
        'セル「"B" & i 」の値から"A"を削除
        'セル「"B" & i 」の値から"B"を削除
        'セル「"C" & i 」の値から"C"を削除
    For i = 2 To rowsData
        Cells(i, 2) = Replace(Cells(i, 2), "A", "")
        Cells(i, 3) = Replace(Cells(i, 3), "B", "")
        Cells(i, 4) = Replace(Cells(i, 4), "C", "")
    Next i

     'アクティブシートの5行目以降に、以下をループ処理
        'k行E列の値として以下を計算して設定
            'D列+( [B列 - B列の1つ上のセル]の平方根の2乗
                '      + [C列 - C列の1つ上のセル]の平方根の2乗
                '      + [D列 - D列の1つ上のセル]の平方根の2乗 ) ×0.02
    For k = 5 To rowsData
    Cells(k, 5) = Cells(k - 1, 5) + (Sqr((Cells(k, 2) - Cells(k - 1, 2)) ^ 2 + (Cells(k, 3) - Cells(k - 1, 3)) ^ 2 + (Cells(k, 4) - Cells(k - 1, 4)) ^ 2)) * 0.02

    ↑この部分が型が一致しません。とでているようです。
    ここ以下の確認はできておりません。

    Next k
' -----以下割愛
End Sub

 
なんとなくですが、Excelが計算しようとおもっても文字が入ってるから計算できないって言ってるだけにおもいます。イミディエイトウィンドウにそれぞれのセル値のデータ型を表示させてみてはどうでしょうか
 
質問とは関係ないですけど、行カウント用の変数は使い回したほうがすっきりするような気がします。好みの問題でしょうが・・
 
さらにいえば、要素数がわかっているならば数値型の静的配列用意してそこに入れるようにしてやればいいんじゃないですかね。。。

投稿日時: 17/12/01 17:32:53
投稿者: HIDETOTO

hatch315さん
もこな2さん
コードの編集までしていただきありがとうございます。
 
エクセルのシートで確認してもすべて右詰になっているので問題ないかと思っていましたが
どこかで問題が起こっていそうですかね・・・
 
プログラムを順に送ると計算のところでエラーが出ているのですが、実際の入力データをすべて見ないとわかりにくいですよね
すみません。
 
アドバイスいただいたことを検討しながらもうちょっと自分で考えてみます。
 
ありがとうございました。