Как определить пол человека в VBA Excel
Задан массив из ФИО. Нужно определить пол каждого человека по последней гласной букве. Вот код, он работает, но выводить только мужской пол
Private Sub CommandButton1_Click()
Dim s, i, a As Integer
Dim h, g As String
gls = ("а""я""о""е""ё""у""ю""ы""и""э")
For a = 1 To 10
h = Cells(a, 1)
i = (InStr(h, " "))
g = i - 1
If gls = g Then
Cells(a, 3) = "жен"
Else
Cells(a, 3) = "муж"
End If
Next a
End Sub
Как исправить?
Ответы (2 шт):
g - строковая переменная, сюда Вы хотели записать букву, но записываете число:
g = i - 1
А надо было взять символ, находящийся на позиции i - 1
Даже если в g получили каким-то образом букву, то дальнейшее сравнение ничего не дает:
If gls = g Then
Вернее, всегда вернет False, т.к. символ не может быть равен тексту из нескольких символов.
Попутные ошибки или "кривость писанины".
В VBA тип нужно указывать для каждой переменной, иначе тип - Variant
Переменным нужно давать имена, по которым легче ориентироваться в коде. Однобуквенные - обычно для счетчиков.
"а""я""о""е""ё""у""ю""ы""и""э" - в тексте сдвоенные кавычки означают наличие кавычки, т.е. в переменную записываете строку "а"я"о"е"ё"у"ю"ы"и"э"
Cells(i, 1) - по умолчанию подразумевается значение ячейки, но такая запись также означает диапазон. Для избежания возможных ошибок правильнее явно указывать, что хотите получить.
Private Sub CommandButton1_Click()
Dim sLetter As String, sName As String
Dim i As Integer
Const cSymbols As String = "аяоеёуюыиэ"
For i = 1 To 10
sName = Cells(i, 1).Value
sLetter = Mid$(sName, InStr(sName, " ") - 1, 1)
If InStr(cSymbols, sLetter) Then
Cells(i, 3).Value = "жен"
Else
Cells(i, 3).Value = "муж"
End If
Next i
End Sub
Весь набор гласных для этой задачи не нужен. Достаточно знать, что мужские отчества заканчиваются на "ч" (не всегда, но в подавляющем большинстве случаев)
Sub Button1_Click()
Dim oCell As Range
Dim sFullName As String
Set oCell = [A2]
Do While True
sFullName = Trim(oCell.Text)
If sFullName = vbNullString Then Exit Sub
If Right(sFullName, 1) = "." Then ' На случай если вместо полного ФИО только инициалы
oCell.Offset(0, 2).Value = "???"
ElseIf LCase(Right(sFullName, 1)) = "ч" Then
oCell.Offset(0, 2).Value = "муж"
Else
oCell.Offset(0, 2).Value = "жен"
End If
Set oCell = oCell.Offset(1, 0)
Loop
End Sub