Сортиране на рождени дни в Excel VBA - Лесни Excel макроси

Съдържание

По -долу ще разгледаме програма в Excel VBA че подрежда рождени дни до месеци първи и дни втори (така че игнорираме години). Искаме рожденият ден с най -ниския месец на първата позиция. Ако има рождени дни с еднакви номера на месец, първо искаме рожденият ден с най -малкия номер на деня. Готов ли си?

Ситуация:

Забележка: Датите са в американски формат. Първи месеци, втори дни. Този тип формат зависи от регионалните настройки на вашия Windows.

1. Първо, декларираме осем променливи. Една променлива дата наричаме tempDate, една променлива String наричаме tempName. Останалите шест променливи са целочислени променливи с имена месецToCheck, dayToCheck, monthNext, dayNext, i и j.

Dim tempDate As Date, tempName As String
Dim monthToCheck As Integer, dayToCheck As Integer, monthNext As Integer, dayNext As Integer, i As Integer, j As Integer

2. Започваме два цикъла For Next.

За i = 2 до 13
За j = i + 1 до 13

Пример: за i = 2, j = 3, 4,…, 12 и 13 се проверяват.

3. Инициализираме четири целочислени променливи. Използваме функцията Month, за да получим месец на датата, а функцията Day, за да получим деня на датата.

monthToCheck = месец (Клетки (i, 2). Стойност)
dayToCheck = ден (Клетки (i, 2). Стойност)
месец Следващ = месец (Клетки (j, 2). Стойност)
dayNext = ден (Клетки (j, 2). Стойност)

Например: в началото, за i = 2; датата на Bregje и j = i + 1 = 2 + 1 = 3; ще бъде избрана датата на Niels.

4. За да сортираме датите правилно, сравняваме първата дата (monthToCheck и dayToCheck) със следващата дата (monthNext и dayNext). Ако следващата дата е „по -ниска“, ние разменяме датите и имената. Добавете следния израз If If.

Ако (monthNext <monthToCheck) Или (monthNext = monthToCheck And dayNext <dayToCheck) Тогава
Край Ако

Ако горното твърдение е вярно, сменяме датите и имената.

Например: за i = 2 и j = 3 се проверява датата на Bregje и Niels. MonthNext = 6, monthToCheck = 2. Горното твърдение не е вярно, тъй като monthNext е по -високо от monthToCheck. Excel VBA увеличава j с 1 и повтаря кодовите редове за i = 2 и j = 4. Можете лесно да видите, че Joost (j = 4) има по -висок номер на месец от Bregje, така че преминаваме към следващия. Получаваме същия резултат за j = 5 и j = 6. Когато стигнем до j = 7, имаме следните променливи: monthNext = 2 и dayNext = 9. MonthToCheck = 2 и dayToCheck = 12. Сега горното твърдение е вярно от monthNext = monthToCheck и dayNext (9) е по -ниско от dayToCheck (12).

5. Разменяме датите. Временно съхраняваме една дата за tempDate, така че Excel VBA да може да размени датите правилно. Добавете следните кодови редове в израза If.

датите за размяна
tempDate = Клетки (i, 2)
Клетки (i, 2). Стойност = Клетки (j, 2)
Клетки (j, 2) .Value = tempDate

6. Правим същото с имената. Добавете следните кодови редове в израза If.

разменя имена
tempName = Клетки (i, 1)
Клетки (i, 1). Стойност = Клетки (j, 1)
Клетки (j, 1). Значение = tempName

7. Затваряме втория цикъл For Next (Извън оператора If).

Следващ j

За i = 2 и j = 7, Excel VBA размени датите и имената. Това означава, че получаваме Ричард на първа позиция и Bregje на позиция 7. Това също означава, че получаваме нов месецToCheck и dayToCheck в началото на следващата ни итерация (за i = 2 и j = 8). Сега ще сравним Ричард с Динеке (j = 8). Лесно можете да видите, че няма нужда да заменяте тези дати и имена, защото Ричард има „по -ниска“ дата. Всъщност няма нужда да се заменят Ричард (i = 2) с Jan (j = 9), Wendy (j = 10), Jeroen (j = 11), John (j = 12) и Debby (j = 13). Това е така, защото Ричард има „най -ниската“ дата. По този начин Excel VBA ще получи (за i = 2) "най -ниската" дата на първата позиция. За да получи втората „най -ниска“ дата на втората позиция, Excel VBA повтаря същите стъпки за i = 3. За да получи третата „най -ниска“ дата на третата позиция, Excel VBA повтаря същите стъпки за i = 4, и т.н.

8. Затворете първия цикъл For Next (Извън оператора If).

Следва i

9. Тествайте програмата си.

Резултат:

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave