¿如何获得细胞的确切地址? (VB.NET/INTEROP.EXCEL)

时间:2016-09-15 22:09:59

标签: vb.net excel excel-interop

是。我正在使用几乎没有人喜欢的库(COM / Interop)。我正在练习一个程序来分析Excel工作簿,识别它的列,用户拨打每个类型。一切都很完美,我可以检测每列类型中的错误(例如,如果数字列中有一个字符串),但我唯一遇到问题的类型是日期。我昨天在这里问了一个关于日期的问题(因为我想到了什么)但我从那个问题知道日期只是数字......这没问题,因为我可以使用Date.fromOADate。

嗯,我面临的情况是,如果Excel列包含日期信息,例如,您在该日期列中添加数据字符串,当在程序中加载Excel工作簿时,该数据字符串未标记它作为一个错误..但把它视为一个空单元格(令我惊讶的事情)。

这是我写的用于标记每列错误的函数

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

好吧,正如我所说的前两种类型运行良好,问题是当我开始比较日期数据类型时。如果列是日期类型,我有这个想法:如果程序返回一个空单元格(如前所述,字符串数据将我返回为空单元格),程序将获取单元格的地址以进行替换。我已经编写了替换方法...只有当参数必须通过时才是今天的日期,单元格的确切地址和列名。

当变量“itm”为空(A4,B3,C50 ......等)时,我想查看循环当前单元格的地址

enter image description here

2 个答案:

答案 0 :(得分:0)

我的代码中没有看到对Excel.Interop的任何引用。对于前26列,您可以使用Chr

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

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

答案 1 :(得分:0)

好的,伙计,我找到了解决这个问题的方法。我没有使用互操作,但我得到了我想要的东西。

首先,我需要根据列名获取该字母。我发现web是一个函数,它通过传递一个数字

来返回excel的列字母
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/