¿Comment get l'adresse exacte d'une cellule? (VB.NET/INTEROP.EXCEL)

Oui. J'utilise une bibliothèque que presque personne n'aime (COM / Interop). Je pratique un programme qui analize un classur Excel, identifie ses colonnes et l'user compose le type de chacun. Tout est parfait, je peux détecter des erreurs dans le type de chaque colonne (par exemple si il y a une string dans une colonne numérique), mais le seul type que j'ai eu des problèmes est avec les dates. J'ai posé une question ici hier concernant les dates (car j'ai pensé à quelque chose), mais je sais de cette question que les dates ne sont que des numbers … Ce n'est pas un problème parce que je peux utiliser Date.fromOADate.

Eh bien, la situation à laquelle je suis confronté est que si une colonne Excel contient des informations de dates et, par exemple, vous ajoutez une string de données dans cette colonne de dates, lors du chargement du livre Excel dans le programme, cette string de données n'a pas marqué comme une erreur …. mais le traite comme une cellule vide (Ce qui m'a surpris).

C'est la fonction que j'ai écrite pour marquer les erreurs de chaque colonne

Protected Friend Function obtenerErroresColumna(ByVal column As Ssortingng, ByVal page As Ssortingng, ByVal tipe As Ssortingng) As Integer If (Not Ssortingng.IsNullOrEmpty(column)) Then Dim cmd As Ssortingng = "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("Ssortingng")) 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, comme je l'ai dit, les deux premiers types fonctionnent bien, le problème est quand je commence à comparer le type de données de date. J'ai cette idée si la colonne est le type de date: si le programme renvoie une cellule vide (comme je l'ai dit plus tôt, datatables de string me renvoient comme des cellules vides), puis le programme obtient l'adresse de la cellule pour replace. J'ai déjà écrit la méthode de substitution … uniquement puisque les parameters devraient passer sont la date d'aujourd'hui, l'adresse exacte de la cellule et le nom de la colonne.

Je voudrais vérifier l'adresse de la cellule actuelle de la boucle lorsque la variable "itm" est Null (A4, B3, C50 …. Etc)

entrez la description de l'image ici

Je ne vois aucune reference à Excel.Interop dans votre code. Pour les 26 premières colonnes, vous pouvez utiliser Chr :

 Dim adr = Function(col%, row%) Chr(64 + col) & row Dim B3 = adr(2, 3) ' "B3" 

Ok gars, j'ai trouvé la solution de ce problème. Je n'ai pas utilisé l'interop mais j'ai ce que je voulais.

D'abord, je devais get la lettre en fonction du nom de la colonne. J'ai trouvé le Web une fonction qui renvoie les lettres de colonne d'Excel en passant comme un paramètre un numéro

 Private Function ColumnIndexToColumnLetter(colIndex As Integer) As Ssortingng Dim div As Integer = colIndex Dim colLetter As Ssortingng = Ssortingng.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 

J'insère un countur dans la fonction qui détecte les erreurs, ce countur countra les cellules dans la colonne pour get le numéro de colonne, je crée une autre fonction qui a porté les colonnes dans une list de masortingces.

Je prends la fonction indexOf

 Protected Friend Function obtenerErroresColumna(ByVal columna As Ssortingng, ByVal hoja As Ssortingng, ByVal tipo As Ssortingng) As Integer If (Not Ssortingng.IsNullOrEmpty(columna)) Then Dim cmd As Ssortingng = "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 = cargarMasortingzColumnas(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 

entrez la description de l'image ici

Source de la fonction: https://www.add-in-express.com/creating-addins-blog/2013/11/13/convert-excel-column-number- to- name/