2016-09-15 10 views
0

はい。私はほとんど誰も気に入らないライブラリ(COM/Interop)を使用しています。私は、Excelワークブックを解析し、その列を識別し、ユーザーがそれぞれの種類をダイヤルするプログラムを実行することを練習しています。すべてが完璧に機能し、各列の型のエラーを検出することができます(たとえば、数値列に文字列がある場合など)。問題が発生している唯一の型は日付です。私は昨日ここで質問をしました。何か考えていたからですが、その質問から日付は単なる数字であることが分かっています。これは問題ありません。Date.fromOADateを使うことができます。¿セルの正確なアドレスを取得する方法は? (VB.NET/INTEROP.EXCEL)

私が直面している状況は、Excelの列に日付の情報が含まれていて、たとえば、そのデータ列がマークされていないExcelブックをプログラムに読み込むときに、エラーとして。それを空のセル(私を驚かせた事)として扱います。私は、日付データ型を比較す​​るために起動したときに

この

は私が最初の2つのタイプが良い実行されて言ったように私は、

Protected Friend Function obtenerErroresColumna(ByVal column As String, ByVal page As String, ByVal tipe As String) As Integer 
    If (Not String.IsNullOrEmpty(column)) Then 
     Dim cmd As String = "Select [" & column & "] from [" & page & "$]" 
     Dim errors As Integer = 0 
     Dim table As New DataTable 
     Try 
      Dim adapter As New OleDbDataAdapter(cmd, conexion) 
      adapter.Fill(table) 
      adapter.Dispose() 
      For Each itm In table.Rows 
       If (tipe.Equals("String")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (IsNumeric(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       ElseIf (tipe.Equals("Numeric")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsNumeric(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       ElseIf (tipe.Equals("Date")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsDate(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       End If 
      Next 
      table.Dispose() 
      Return errors 
     Catch ex As Exception 
      boxMessage("Error", ex.Message, My.Resources._error).ShowDialog() 
      Return errors 
     End Try 
    Else 
     Return 0 
    End If 
End Function 

[OK]を、各列のエラーをマークするために書いた関数であり、問​​題があります。列が日付型の場合、私はこの考え方を持っています。プログラムが空のセルを返す場合(前に述べたように、文字列データが空のセルとして返されます)、プログラムはセルのアドレスを取得して置換します。私はすでに代入のためのメソッドを書いています...パラメータとして渡さなければならないのは、今日の日付、セルの正確なアドレスと列名です。

変数が "ITM" は(ETC A4、B3、C50 ...)

enter image description here

答えて

0

Iドン」NULLの場合、私は、ループの現在のセルのアドレスを確認したいですコード内のExcel.Interopへの参照を参照してください。最初の26列の場合、あなたはChrを使用することができます。

Dim adr = Function(col%, row%) Chr(64 + col) & row 

Dim B3 = adr(2, 3) ' "B3" 
+0

を私は列の数、ページ、および使用される範囲を検出するために、相互運用機能を使用します。私がここに示す関数は、単にセルのデータを比較するためのものです...変数 "itm"がNullのとき、ループの現在のセルをチェックしたいと思います。 – TwoDent

0

[OK]をみんな、私はこの問題の解決策を見つけました。私はinteropを使いませんでしたが、私は欲しかったものを手に入れました。

最初に、列名に従って文字を取得する必要がありました。取得する間、私は私がエラーを検出した機能でカウンターを挿入し、パラメータとして1つの番号

Private Function ColumnIndexToColumnLetter(colIndex As Integer) As String 
    Dim div As Integer = colIndex 
    Dim colLetter As String = String.Empty 
    Dim modnum As Integer = 0 

    While div > 0 
     modnum = (div - 1) Mod 26 
     colLetter = Chr(65 + modnum) & colLetter 
     div = CInt((div - modnum) \ 26) 
    End While 

    Return colLetter 
End Function 

を渡すことによって、エクセルの列文字を返す関数ウェブを発見し、このカウンタは列のセルをカウントします列番号、私はarrayListの列を運ぶ別の関数を作成します。

私はindexOfの機能に機能の

Protected Friend Function obtenerErroresColumna(ByVal columna As String, ByVal hoja As String, ByVal tipo As String) As Integer 
    If (Not String.IsNullOrEmpty(columna)) Then 
     Dim cmd As String = "Select [" & columna & "] from [" & hoja & "$]" 
     Dim errores As Integer = 0 
     Dim tabla As New DataTable 
     Dim cell As Integer = 2 
     Dim column As New ArrayList 
     column = cargarMatrizColumnas(hoja) 
     Try 
      Dim adapter As New OleDbDataAdapter(cmd, conexion) 
      adapter.Fill(tabla) 
      adapter.Dispose() 
      For Each itm In tabla.Rows 
       If (tipo.Equals("Cadena")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (IsNumeric(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        End If 
       ElseIf (tipo.Equals("Numerico")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsNumeric(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        End If 
       ElseIf (tipo.Equals("Fecha")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsDate(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        Else 
         MsgBox("Direccion: " & ColumnIndexToColumnLetter(column.IndexOf(columna) + 1) & cell) 
        End If 
        cell += 1 
       End If 
      Next 
      tabla.Dispose() 
      Return errores 
     Catch ex As Exception 
      cajaMensaje("Error inesperado", ex.Message, My.Resources._error).ShowDialog() 
      PantallaPrincipal.lbldireccion.ForeColor = Color.Red 
      Return errores 
     End Try 
    Else 
     Return 0 
    End If 
End Function 

enter image description here

出典取る:https://www.add-in-express.com/creating-addins-blog/2013/11/13/convert-excel-column-number-to-name/

関連する問題