Как найти четное число в vba

Using VBA Code Found On The Internet

Now that you’ve found some VBA code that could potentially solve your Excel automation problem, what do you do with it? If you don’t necessarily want to learn how to code VBA and are just looking for the fastest way to implement this code into your spreadsheet, I wrote an article (with video) that explains how to get the VBA code you’ve found running on your spreadsheet.

Getting Started Automating Excel

Are you new to VBA and not sure where to begin? Check out my quickstart guide to learning VBA. This article won’t overwhelm you with fancy coding jargon, as it provides you with a simplistic and straightforward approach to the basic things I wish I knew when trying to teach myself how to automate tasks in Excel with VBA Macros.

Also, if you haven’t checked out Excel’s latest automation feature called Power Query, I have put together a beginner’s guide for automating with Excel’s Power Query feature as well! This little-known built-in Excel feature allows you to merge and clean data automatically with little to no coding!

How Do I Modify This To Fit My Specific Needs?

Chances are this post did not give you the exact answer you were looking for. We all have different situations and it’s impossible to account for every particular need one might have. That’s why I want to share with you: My Guide to Getting the Solution to your Problems FAST! In this article, I explain the best strategies I have come up with over the years to get quick answers to complex problems in Excel, PowerPoint, VBA, you name it

I highly recommend that you check this guide out before asking me or anyone else in the comments section to solve your specific problem. I can guarantee that 9 times out of 10, one of my strategies will get you the answer(s) you are needing faster than it will take me to get back to you with a possible solution. I try my best to help everyone out, but sometimes I don’t have time to fit everyone’s questions in (there never seem to be quite enough hours in the day!).

I wish you the best of luck and I hope this tutorial gets you heading in the right direction!

Chris
Founder, TheSpreadsheetGuru.com

  • Remove From My Forums
  • Question

  • As the title says, I need to check to make sure certain numbers that I am working with are even
    numbers only.

Answers

  •         Dim mynumber As Integer = CInt(TextBox1.Text)  
     
            If mynumber Mod 2 = 0 Then 
                MsgBox(«Number is Even»)  
            Else 
                MsgBox(«Number is Odd»)  
            End If 
    • Marked as answer by

      Monday, March 9, 2009 9:21 AM

  • A simple bitwise comparison
    against the number you want to test, such as

    myNumber And 1

    When you do, Visual Basic returns either a 0 or 1—1 for odd
    numbers, and 0 for even numbers. You can then use these results
    in your code. 

    For a simple example, launch a standard Visual Basic project and
    add a textbox and command button to the default form. Next, in
    the command button’s Click() event, add the following code:

    Dim blnIsOdd As Boolean
    blnIsOdd = CLng(Text1.Text) And 1
    MsgBox blnIsOdd

    Press [F5] to run the project. Enter a number in the textbox and
    click the command button. When you do, Visual Basic tells you
    whether the number is odd or not.


    Thanks,
    A.m.a.L

    • Marked as answer by
      allanm1
      Monday, March 9, 2009 9:23 AM

12345678

1 / 1 / 0

Регистрация: 19.09.2012

Сообщений: 54

1

Четное/нечетное число

05.04.2013, 21:07. Показов 38111. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Задача звучит так: Написать программу, которая проверяет целые числа на четность. В программе проверять, будет ли вводимое число целым. Результат вывести в виде текстового сообщения True или False.
Не совсем правильно работающий код:

Visual Basic
1
2
3
4
5
 Dim N As Integer
        If (N / 2) = Int(N / 2) Then
            MsgBox("True")
        Else : MsgBox("False")
        End If

Когда ввожу нечетное число, все равно True пишет. В чем проблема?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

05.04.2013, 21:07

5

Pro_grammer

6794 / 2816 / 527

Регистрация: 24.04.2011

Сообщений: 5,308

Записей в блоге: 10

05.04.2013, 21:26

2

Лучший ответ Сообщение было отмечено The trick как решение

Решение

Да вроде всё правильно, правда в коде не видно, куда вводишь число?
Есть ещё способ

Visual Basic
1
2
3
4
5
6
Dim N As Integer
N = 4
        If (N Mod 2) Then
            MsgBox "False"
        Else: MsgBox "True"
        End If



1



1 / 1 / 0

Регистрация: 19.09.2012

Сообщений: 54

05.04.2013, 21:37

 [ТС]

3

Pro_grammer, вводится число в Label.
Ваш вариант попробовала, все равно на все числа True выдает(



0



gaw

6644 / 1511 / 169

Регистрация: 09.01.2010

Сообщений: 4,298

05.04.2013, 21:50

4

Visual Basic
1
2
a = Val(Replace(InputBox("a-?"), ",", "."))
MsgBox IIf(Int(a) = a, m = (a Mod 2), "Int !")

Цитата
Сообщение от 12345678
Посмотреть сообщение

все равно на все числа True выдает(

например



0



6794 / 2816 / 527

Регистрация: 24.04.2011

Сообщений: 5,308

Записей в блоге: 10

05.04.2013, 22:05

5

Цитата
Сообщение от 12345678
Посмотреть сообщение

все равно на все числа True выдает(

Вы вместо N=4 подставляли свои значения и у вас не работает? Не верю!

А в вашем коде из лабела как число в формулу попадает? Напишите весь код.



0



1 / 1 / 0

Регистрация: 19.09.2012

Сообщений: 54

05.04.2013, 22:28

 [ТС]

6

Pro_grammer, нашла ошибку. Не хватало N = Val(TextBox1.Text)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

05.04.2013, 22:28

Помогаю со студенческими работами здесь

Разработать функцию f(x), которая нечётное число заменяет на 0, а чётное число уменьшает в 2 раза
Помогите составить функцию на языке программирования С++
Разработать функцию f(x), которая…

Метод который нечетное число заменяет на 0, а четное число уменьшает в два раза
Ребята, помогите разработать метод f (x), который нечетное число заменяет на 0, а четное число…

Разработать метод f(x), который нечетное число заменяет на 0, а четное число уменьшает в два раза
Разработать метод f(x), который нечетное число заменяет на 0, а четное число уменьшает в два…

Разработать метод, который нечетное число заменяет на 0,а четное число уменьшает в два раза
Разработать метод f (х) , который нечетное число заменяет на 0, а четное число уменьшает в два…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Формулировка задачи:

Создать форму и разместить в ней 2 текстовых поля. При вводе в 1-е поле нечетного число, во 2-м поле должно появляться слово «Нечетное», при вводе четного числа — слово «Четное», если введено не число, то отобразить во 2-м поле «Неверный код»

Код к задаче: «Определить, является ли введенное число четным»

textual

Private Sub CommandButton1_Click()
 Dim s
 s = TextBox1.Text
 Select Case s
 Case Val(s) Mod 2 = 0
 d = "Четное"
 Case Val(s) Mod 2 = 1
 d = "Нечетное"
Case Else
  d = "Код неверный"
 End Select
 TextBox2.Text = d
End Sub

Полезно ли:

8   голосов , оценка 4.125 из 5

Быстрая проверка числа. Четное или нечетное

jangle
Википедик
Википедик
Аватара пользователя

 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Быстрая проверка числа. Четное или нечетное

Мне нужно проверять большие объемы чисел и сортировать их по четности. Пока ничего лучшего, кроме деления на 2 и проверки наличия остатка я не предумал. Может есть более быстрый и оптимальный способ проверки числа на четность?

Код на PB:

Код: Выделить всё
#Compile Exe
#Dim All

Function PBMain () As Long
    Dim Ch As Long
    Ch=Val(InputBox$("Input Number"))

    If Frac(Ch/2)>0 Then
        MsgBox "Нечетное"
     Else
        MsgBox "Четное"
    End If

End Function


Хакер
Телепат
Телепат
Аватара пользователя

 
Сообщения: 16460
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 08.11.2007 (Чт) 22:01

If CBool(число And 1) Then Нечётное.

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя

 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва
  • Сайт

Сообщение keks-n » 08.11.2007 (Чт) 23:32

If число Mod 2 Then Нечётное

If (число / 2)=(число2) Then Чётное

Изображение


Lumen
Постоялец
Постоялец
Аватара пользователя

 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск
  • Сайт

Сообщение Lumen » 09.11.2007 (Пт) 2:07

Я всегда проверял подобное методом №1 от keks-n‘а. А в паскале (Delphi) к примеру есть такая функция как Odd. Возвращает true если число нечетное и false, если четное.

Подпись проходит рефакторинг


Хакер
Телепат
Телепат
Аватара пользователя

 
Сообщения: 16460
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 09.11.2007 (Пт) 6:37

А вы не видели, что автор спрашивает оптимальнейший и быстрейший способ, коим является способ, предложенный мною, ибо в отличие от всех остальных способов, проделвается одной лишь инструкцией процессора?

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.11.2007 (Пт) 7:53

«метод №1 от keks-n’а» скорее всего скомпилируется точно так же.

Компилятор — он умный.

CBool у тебя лишний, кстати.

Изображение


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.11.2007 (Пт) 9:09

And немного быстрее, чем Mod.

А CBool лишний.

Lasciate ogni speranza, voi ch’entrate.


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.11.2007 (Пт) 9:19

alibek писал(а):And немного быстрее, чем Mod.

Компилятор про это знает, и поэтому скомпилирует Mod 2 как And 1.

Делфийский точно так делает; с VB не проверял, но вряд ли он глупее.

Изображение


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.11.2007 (Пт) 9:22

tyomitch, но у автора PB, он может и не настолько умный.

Lasciate ogni speranza, voi ch’entrate.


Хакер
Телепат
Телепат
Аватара пользователя

 
Сообщения: 16460
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 09.11.2007 (Пт) 9:27

Код: Выделить всё
Public Function my_mod(ByVal e As Long) As Long

    If e Mod 2 Then

        ass = 123

    End If

End Function

Public Function my_and(ByVal e As Long) As Long

    If e And 1 Then

        assd = 123

    End If

End Function

Код: Выделить всё
110019A0 mod     MOV ECX,DWORD PTR SS:[ESP+4]
110019A4         XOR EAX,EAX
110019A6         AND ECX,80000001
110019AC         JNS SHORT test.110019B3
110019AE         DEC ECX
110019AF         OR ECX,FFFFFFFE
110019B2         INC ECX
110019B3         JE SHORT test.110019BA
110019B5         MOV EAX,7B
110019BA         RETN 4

110019C0 and     MOV CL,BYTE PTR SS:[ESP+4]
110019C4         XOR EAX,EAX
110019C6         TEST CL,1
110019C9         JE SHORT test.110019D0
110019CB         MOV EAX,7B
110019D0         RETN 4

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.11.2007 (Пт) 10:47

Т.е. в обоих случаях фактически And, но в первом чуть больше сложностей из-за отрицательных чисел.

Изображение


jangle
Википедик
Википедик
Аватара пользователя

 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 09.11.2007 (Пт) 11:36

Спасибо за советы, решил проверить все методы на скорость работы, и вычислить среднее время работы каждого способа проверки:

Код на PB 8.03:

Код: Выделить всё
#Compile Exe
#Dim All

Declare Function GetTickCount Lib "KERNEL32.DLL" Alias "GetTickCount" () As Long
Macro maxtest = 100000000

Function PBMain () As Long

Dim Ch As Long
Dim i  As Long
Dim u  As Long
Dim Result As Long
Dim t As Long
Dim Itog As Long
Dim x As Long

'-------------------------------------------------------------------
' Проверка с помощью IF
    t=0
    Result=0
    Itog=0

    For x=1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i=1 To maxtest
           If Frac(i/2)>0 Then
               Result=1 ' "Нечетное"
            Else
               Result=2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog=Itog + u
       t=0
    Next x
'-------------------------------------------------------------------

MsgBox  "Проверка с помощью IF "  & Str$(itog/10) & " мсек. в среднем"

'-------------------------------------------------------------------
' Проверка с помощью AND
    t=0
    Result=0
    Itog=0

    For x=1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i=1 To maxtest
            If (i And 1) Then
               Result=1 ' "Нечетное"
            Else
               Result=2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog=Itog + u
       t=0
    Next x
'-------------------------------------------------------------------

MsgBox  "Проверка с помощью AND "  & Str$(itog/10) & " мсек. в среднем"

'-------------------------------------------------------------------
' Проверка с помощью MOD
    t=0
    Result=0
    Itog=0
    For x=1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i=1 To maxtest
            If (i Mod 2) Then
               Result=1 ' "Нечетное"
            Else
               Result=2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog=Itog + u
       t=0
    Next x
'-------------------------------------------------------------------

MsgBox  "Проверка с помощью MOD "  & Str$(itog/10) & " мсек. в среднем"

End Function         

Код на VB6

Код: Выделить всё
Option Explicit

Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
Const maxtest = 100000000

Sub Main()

Dim Ch As Long
Dim i  As Long
Dim u  As Long
Dim Result As Long
Dim t As Long
Dim Itog As Long
Dim x As Long
Dim p As Double

'-------------------------------------------------------------------
' Проверка с помощью IF
    t = 0
    Result = 0
    Itog = 0

        For x = 1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i = 1 To maxtest
           p = (i / 2)
           If p - Int(p) > 0 Then
               Result = 1 ' "Нечетное"
            Else
               Result = 2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog = Itog + u
       t = 0
    Next x
'-------------------------------------------------------------------

MsgBox "Проверка с помощью IF " & Str$(Itog / 10) & " мсек. в среднем"

'-------------------------------------------------------------------
' Проверка с помощью AND
    t = 0
    Result = 0
    Itog = 0

        For x = 1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i = 1 To maxtest
            If (i And 1) Then
               Result = 1 ' "Нечетное"
            Else
               Result = 2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog = Itog + u
       t = 0
    Next x
'-------------------------------------------------------------------

MsgBox "Проверка с помощью AND " & Str$(Itog / 10) & " мсек. в среднем"

'-------------------------------------------------------------------
' Проверка с помощью MOD
    t = 0
    Result = 0
    Itog = 0

    For x = 1 To 10
     t = GetTickCount - t
     u = GetTickCount
        For i = 1 To maxtest
            If (i Mod 2) Then
               Result = 1 ' "Нечетное"
            Else
               Result = 2 ' "Четное"
            End If
        Next i

       u = GetTickCount - u
       Itog = Itog + u
       t = 0
    Next x
'-------------------------------------------------------------------

MsgBox "Проверка с помощью MOD " & Str$(Itog / 10) & " мсек. в среднем"

End Sub

Тестовая машина: P4-3 Ггц, двухядерный, с 512 мб ОЗУ

Результаты:

Проверка с помощью IF:

PB — 2553.2 мсек

VB — 5501.1 мсек

Проверка с помощью AND:

PB — 181.2 мсек

VB — 140.6 мсек

Проверка с помощью MOD:

PB — 1487.5 мсек

VB — 139.1 мсек

Если подвести итоги, VB проигрывает по скорости проверки через IF, но выигрывает при использовании AND и MOD

В аттаче исходники и EXE

Вложения
speed.zip
(8.79 Кб) Скачиваний: 46

Последний раз редактировалось jangle 09.11.2007 (Пт) 11:50, всего редактировалось 2 раз(а).


jangle
Википедик
Википедик
Аватара пользователя

 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 09.11.2007 (Пт) 11:44

Хакер писал(а):А вы не видели, что автор спрашивает оптимальнейший и быстрейший способ, коим является способ, предложенный мною, ибо в отличие от всех остальных способов, проделвается одной лишь инструкцией процессора?

Действительно, для PB проверка через AND — самая быстрая. А в VB6 AND и MOD практически одинаковы по скорости


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.11.2007 (Пт) 12:13

jangle писал(а):Проверка с помощью AND:

PB — 181.2 мсек
VB — 140.6 мсек

Проверка с помощью MOD:

PB — 1487.5 мсек
VB — 139.1 мсек

Как и ожидалось, IEEE-совместимый компилятор PB настолько тупой, что не догадался заменить Mod на And при компиляции.

Может, это стандарт IEEE ему запрещает оптимизировать код? ;-)

А то вдруг другие результаты вычислений после оптимизации станут получаться.

Заодно обратите внимание, что в VB критикуемый Хакером «метод №1 от keks-n’а» оказался самым быстрым.

Изображение


keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя

 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва
  • Сайт

Сообщение keks-n » 09.11.2007 (Пт) 13:37

Дык, сам удивляюсь. Обычно использую (Val And 1), а те 2 просто на всякий случай привёл.

Изображение


Хакер
Телепат
Телепат
Аватара пользователя

 
Сообщения: 16460
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск
  • Сайт
  • ICQ

Сообщение Хакер » 09.11.2007 (Пт) 15:36

Не верю я, что Mod быстрее And.

—We separate their smiling faces from the rest of their body, Captain.

—That’s right! We decapitate them.


Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 23.11.2007 (Пт) 21:02

Разница в 1,5 мс скорее всего меньше погрешности измерений.

Нужно больше экспериментальных данных с разными наборами чисел, чтобы выявить такую небольшую разницу.



Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Понравилась статья? Поделить с друзьями:
  • Как найти безударную гласную в корне ответ
  • Как составить отношение на практику
  • Как найти площадь окружности зная окружность
  • Как исправить баг в геншин импакт
  • Как найти вампирские ножи в террарии