Stránka 1 z 1

VBA error- Type Mismatch

Napsal: 13 zář 2009 21:53
od Dieesels
Dobrý den,

mám problém z importem dat z csv. Mám hotový VBA code, vše by mělo fungovat, bohužel, jak z předmětu vyplývá, háže mi to chybu Type mismatch. Zkoušel jsem krokovat, bohužel neúspěšně, budu rád, když se na to podíváte. Protože, už opravdu nevím, kde dělám chybu.

Re: VBA error- Type Mismatch

Napsal: 13 zář 2009 21:56
od domitea
zkus zkontrolovat promene, jestli treba neni bool za int

Re: VBA error- Type Mismatch

Napsal: 14 zář 2009 00:03
od navstevnik
V procedure Sub ProcessCSV mas deklarovane promenne:

Kód: Vybrat vše

Dim tTicket As String, tMFE As String, tPaL1 As String, tMAE As String

a na promenne typu string uplatnujes funkci CLng nebo CDbl:

Kód: Vybrat vše

         Do While Not EOF(1)
            Input #1, tTicket, tMFE, tPaL1, tMAE
            If tTicket <> "Ticket #" Then
                    numPositions = numPositions + 1
                    ReDim Preserve Positions(numPositions)
                   With Positions(numPositions)
                        .Ticket = CLng(tTicket)
                         tMFE = Replace(tMFE, ".", ",", 1)
                        .MFE = CDbl(tMFE)
                        tPaL1 = Replace(tPaL1, ".", ",", 1)
                        .PaL1 = CDbl(tPaL1)
                        tMAE = Replace(tMAE, ".", ",", 1)
                        .MAE = CDbl(tMAE)
                    End With
                    End With
                End If
            End
        Loop
.
Preved promenne na hodnotu pouzitim fce Val: .MFE = CDbl(Val(tMFE)). Ve vyse uvedene casti kodu je prikaz End, ktery proceduru ukonci, odstran. Po odstraneni vyse uvedenych chyb v teto procedure dochazi ke cteni za koncem souboru: pouzita fce Input #1 nacita do kazde z promennych tTicket, tMFE, tPaL1, tMAE po jednom celem radku ze souboru, takze pri poctu radku odlisnych od nasobku 4, dojde k teto chybe, data navic nejsou radne nactena. Dal jsem uz proceduru nezkoumal.
Odkud jsi ty procedury opsal?
Ja bych pouzil trochu jiny postup:
Prikazem Line Input nacetl radky do bunek listu ve sloupci A a pak pouzil fci listu TextDoSloupcu (kde v pripade potreby muzes zadat i typ dat a oddelovac desetinnych mist), viz ukazka kodu (v ukazce navic bylo potreba do jednoho radku vysledku sloucit nekolik radku souboru csv a identifikovat jeho pocatek, na konci souboru byl radek Koniec):

Kód: Vybrat vše

  Open SPathFile For Input As #1
  i = 0
  If Not EOF(1) Then Line Input #1, Str
  Do While Not EOF(1)
    Line Input #1, TmpStr
    ' If DOK or Koniec. in new line then end of record
    If (InStr(TmpStr, "DOK") > 0 Or TmpStr = "Koniec.") Then
      ' insert to sheet
      TargetCll.Offset(i, 0).Value = Str
      ' and delimit TextToColumns method
      TargetCll.Offset(i, 0).TextToColumns Destination:=TargetCll.Offset(i, 0), DataType:=xlDelimited, _
          TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
          Semicolon:=True, Comma:=False, Space:=False, Other:=False
      i = i + 1
      Str = TmpStr
    Else
      Str = Str & ";" & TmpStr
    End If
  Loop
  Close #1


PS.: Nekde jsem se uz s podobnym zpusobem nacitani souboru csv setkal, nebyls to ty?

Re: VBA error- Type Mismatch

Napsal: 14 zář 2009 07:28
od Dieesels
Děkuji za snahu, už se jdu na to mrknout...

Re: VBA error- Type Mismatch

Napsal: 14 zář 2009 08:14
od Dieesels
Původně jsem řešil import tímto codem, který jste mi poradily, zde na poradně:

Kód: Vybrat vše

Option Explicit

Sub InputCsvFile1(ByVal CestaSoubor As String, TargetCll As Range)
  Dim Str As String, PoleTemp
  Dim i As Long, j As Integer

  Open CestaSoubor For Input As #1
  If Not EOF(1) Then
    i = 0
    Do
      Line Input #1, Str
      PoleTemp = Split(Str, ";")
      j = 0
      Do
        If IsNumeric(PoleTemp(j)) Then
          TargetCll.Offset(i, j).Value = CDbl(Val(PoleTemp(j)))
          TargetCll.Offset(i, j).NumberFormat = "0.00"
        Else
          TargetCll.Offset(i, j).Value = PoleTemp(j)
        End If
        j = j + 1
      Loop While j <= UBound(PoleTemp)
      i = i + 1
    Loop While Not EOF(1)
  End If
  Close #1
End Sub

Sub TestInputCsvFile1()
  Dim CestaSoubor As String, TargetCll As Range
  CestaSoubor = "D:\Data\MAE_MFE.csv"
  ' ulozit do:
  Set TargetCll = Worksheets("Výsledky").Range("a1")
  InputCsvFile1 CestaSoubor, TargetCll
End Sub

Sice to funguje, ale neustále se importují data od začátku, což je problém, při větším množství dat. Potřeboval bych, aby se importovala data, pouze a jen ty, který tam ještě nejsou, chybí a ne všechny, po každé aktivaci tohoto vba...
Proto zkouším jiný způsob..

Re: VBA error- Type Mismatch

Napsal: 14 zář 2009 09:02
od navstevnik
Musis se rozhodnout, co je jednodussi a rychlejsi: nacist vse znovu nebo porovnavat jiz ulozene zaznamy se zaznamy v souboru csv pro vylouceni duplicit a nove nacist (nutno vzit do uvahy jine setrideni drivejsich nactenych zaznamu).
Pokud je to tak casove narocne, pak bys mel mit v csv souboru jen prirustek a ten pridat ke stavajicim zaznamum.
PS.: Ulozeni celych zaznamu ze souboru do sloupce a nasledna delimitace prinese oproti tebou uvedene procedure zrychleni.

Re: VBA error- Type Mismatch

Napsal: 14 zář 2009 12:22
od Dieesels
Ok. Opravdu díky za rady