Tengo un archivo que se exportó desde una base de datos de Access, y en este archivo hay una columna para la revisión del software. Cuando se exporta a Excel, la revisión del software se convierte en un "número almacenado como texto". En este caso es el texto "11.3".

Me gustaría verificar que estos valores sean todos iguales, pero no puedo hacer que mi código reconozca el valor de texto de 11.3. Intenté cambiar los valores a un tipo de número y compararlo con un valor de número, pero eso no funciona. Siempre va a mi declaración Else para cerrar la macro.

Aquí está mi código (vaya a 'Verificar SW Rev; aquí es donde ocurre el error):

Private Sub Main()

'Program comments

'Variable definition
Dim wBook As Workbook
Dim sBook As String
Dim rRange As Range
Dim iSoft As Long
Dim iCounter As Long
Dim iLastRow As Long
Dim sTemp As String
Dim dTemp As Double

'Open the Excel file

sBook = Application.GetOpenFilename()

If sBook = "False" Then
    End
End If

Set wBook = Workbooks.Open(sBook)

'Check if PartData sheet exists
If CheckSheet("PartData") = False Then
    MsgBox "Your data does not include the adjuster 'PartData' sheet."
    MsgBox "The macro is aborting now."
    wBook.Close
    End
End If

'Check for correct number of samples
With wBook.Worksheets("PartData")
    Set rRange = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
    If Not rRange Is Nothing Then
        iLastRow = rRange.Column
    Else
        MsgBox "No data.  Aborting."
        End
    End If
    If Not iLastRow = 91 Then
        MsgBox "Incorrect number of samples.  Aborting."
    End If
End With

'Find Version Column

With wBook.Worksheets("PartData").Range("A1:DD1")
    Set rRange = .Find("SW Rev", LookIn:=xlValues)
    If Not rRange Is Nothing Then
        iSoft = rRange.Column
    Else
        MsgBox "Software Revision column 'SW Rev' Not found.  Aborting."
        End
    End If
End With

'Convert SW Rev to numbers
sTemp = ConvertToLetter(iSoft)
wBook.Worksheets("PartData").Range(sTemp & ":" & sTemp).Select
With Selection
    Selection.NumberFormat = "0.0"
    .Value = .Value
End With

'Check for Correct SW Rev
dTemp = 11.3
For iCounter = 2 To iLastRow

    If wBook.Worksheets("PartData").Cells(iSoft, iCounter).Text = dTemp Then
        'Do Nothing
    Else
        'Incorrect SW Rev
        MsgBox "Incorrect SW Rev.  Aborting."
        wBook.Close
        End
    End If

Next iCounter

wBook.Close

End Sub

Function CheckSheet(ByVal sSheetName As String) As Boolean

Dim oSheet As Excel.Worksheet
Dim bReturn As Boolean

For Each oSheet In ActiveWorkbook.Sheets

    If oSheet.Name = sSheetName Then

        bReturn = True
        Exit For

    End If

Next oSheet

CheckSheet = bReturn

End Function

Function ConvertToLetter(iCol As Long) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
   ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
   ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
1
ilarson007 26 ene. 2016 a las 16:51

2 respuestas

La mejor respuesta

Esta es una tontería, pero fue una confusión de fila / columna. En la siguiente línea, debajo de 'Verificar la correcta revisión de software, tenía iCounter e iSoft mezclados.

If wBook.Worksheets("PartData").Cells(iSoft, iCounter).Text = dTemp Then

También lo cambié de nuevo a

If wBook.Worksheets("PartData").Cells(iSoft, iCounter).Text = "11.3" Then
0
ilarson007 26 ene. 2016 a las 16:08

No tengo tiempo en este momento para averiguar dónde está cometiendo un error. Mi mejor suposición es que su rango devuelto por Selection no es el que cree que debería ser.

Pero el siguiente código convierte todos los valores de texto en su hoja de trabajo descargada en valores numéricos:

Option Explicit
Sub ConvertNumbers()
    Dim R As Range

Set R = Cells.Find(what:="SW Rev", after:=Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True)
Set R = Range(R.Offset(1, 0), Cells(Rows.Count, R.Column).End(xlUp))

R = R.Value

End Sub
0
Ron Rosenfeld 26 ene. 2016 a las 15:56