Estoy tratando de escribir una macro para ver si las celdas de una columna consisten solo en consonantes o solo en vocales, y si colorean toda la fila con amarillo. Tengo estas dos funciones para verificar el recuento de consonantes:

Function ConsonantCount(cons As String) As Integer
Dim Str
Dim KCount As Integer
Dim i As Integer
Dim Chr As String

Str = ActiveSheet.Range("A1").Value
KCount = 0
For i = 1 To Len(Str)
    Chr = UCase(Mid(Str, i, 1))
    If Not Chr Like "[AEIOU]" Then
      KCount = KCount + 1
End If
Next i
cons = KCount
End Function

Vocales respectivas:

Function VowelCount(vowl As String) As Integer
Dim Str
Dim KCount As Integer
Dim i As Integer
Dim Chr As String

Str = ActiveSheet.Range("A1").Value
KCount = 0
For i = 1 To Len(Str)
  Chr = UCase(Mid(Str, i, 1))
  If Chr Like "[AEIOU]" Then
    KCount = KCount + 1
End If
Next i
vowl = KCount
End Function

Luego estoy usando las funciones para ver si hay 0 consonantes / vocales para dos columnas diferentes M y N:

Dim iix As Long, FFX As Long
With Sheets("JP")
FFX = .Range("M" & .Rows.count).End(xlUp).Row
For iix = 1 To FFX
    If ConsonantCount(.Range("M" & iix)) = 0 Then
        .Rows(iix).Interior.Color = vbYellow
    End If
    If ConsonantCount(.Range("N" & iix)) = 0 Then
        .Rows(iix).Interior.Color = vbYellow
    End If
    If VowelCount(.Range("M" & iix)) = 0 Then
        .Rows(iix).Interior.Color = vbYellow
    End If
    If VowelCount(.Range("N" & iix)) = 0 Then
        .Rows(iix).Interior.Color = vbYellow
    End If
Next iix
End With

Realmente necesito algo de orientación, bastante nuevo en VBA, ¡Gracias de antemano!

0
Calin Lencar 19 oct. 2017 a las 16:00

3 respuestas

La mejor respuesta

Para ver si una celda contiene solo vocales o solo consonantes, debe verificar la longitud del texto de la celda contra el recuento de vocales o consonantes. Por ejemplo, para ver si una celda es solo consonantes, haría esto:

Len(.Range("M" & iix)) = ConsonantCount(.Range("M" & iix))

También deberá verificar las celdas vacías para que no se resalten. Teniendo en cuenta estas ideas, modifiqué un poco tu código para que funcione como creo que quieres que funcione.

Function ConsonantCount(cons As String) As Integer
   'Dim Str
   Dim KCount As Integer
   Dim i As Integer
   Dim Chr As String

   'Str = ActiveSheet.Range("A1").Value
   KCount = 0

   For i = 1 To Len(cons)
       Chr = UCase(Mid(cons, i, 1))
       If Not Chr Like "[AEIOU]" Then
         KCount = KCount + 1
       End If
   Next i

   ConsonantCount = KCount
End Function

Function VowelCount(vowl As String) As Integer
   'Dim Str
   Dim KCount As Integer
   Dim i As Integer
   Dim Chr As String

   'Str = ActiveSheet.Range("A1").Value
   KCount = 0

   For i = 1 To Len(vowl)
     Chr = UCase(Mid(vowl, i, 1))
     If Chr Like "[AEIOU]" Then
       KCount = KCount + 1
     End If
   Next i

   VowelCount = KCount
End Function

Sub Test()
   Dim iix As Long
   Dim FFX As Long

   With Sheets("JP")
      FFX = .Range("M" & .Rows.Count).End(xlUp).Row

      For iix = 1 To FFX
          If Len(.Range("M" & iix)) > 0 Then
            If Len(.Range("M" & iix)) = ConsonantCount(.Range("M" & iix)) Or Len(.Range("M" & iix)) = VowelCount(.Range("M" & iix)) Then
                .Rows(iix).Interior.Color = vbYellow
            End If
          End If

          If Len(.Range("N" & iix)) > 0 Then
            If Len(.Range("N" & iix)) = ConsonantCount(.Range("N" & iix)) Or Len(.Range("N" & iix)) = VowelCount(.Range("N" & iix)) Then
                .Rows(iix).Interior.Color = vbYellow
            End If
          End If
      Next iix
   End With
End Sub
1
Brian M Stafford 19 oct. 2017 a las 13:53

¿El problema que está viendo está relacionado con el resaltado de líneas que no debería? Esto se debe a que sus funciones deberían terminar con

ConsonantCount = Kcount

Y

VowelCount = Kcount

(En lugar de 'cons = Kcount' y 'vocal = Kcount').

En VBA, usa el nombre de la función para devolver un valor.

3
shrivallabha.redij 19 oct. 2017 a las 13:21

No hay necesidad de verificar letra por letra. Para ver si una celda contiene todas las consonantes o vocales, puede hacer algo como (la función devuelve TRUE o FALSE)

Option Explicit
Option Compare Text 'case insensitive compares

Function AllConsonants(R As Range) As Boolean
    Dim sPat As String

sPat = WorksheetFunction.Rept("[bcdfghjklmnpqrstvwxyz]", Len(R.Text))
AllConsonants = R.Text Like sPat And Len(R.Text) > 0

End Function

Function AllVowels(R As Range) As Boolean
    Dim sPat As String

sPat = WorksheetFunction.Rept("[aeiou]", Len(R.Text))
AllVowels = R.Text Like sPat And Len(R.Text) > 0

End Function
2
Ron Rosenfeld 19 oct. 2017 a las 19:31