Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Почему переменные с одинаковыми значениями не видят друг друга?, и выполнение кода пропускает их одинаковые значения, может из-за кавычек, возвращаемых одной из переменных?
 
фрагмент кода(там всё в надстройке работает, нужно очень долго выдергивать для примера, может так будет понятно?):

Код
  ' В столбец "S" нужно вставлять данные на основе словаря "dicDopi".
           If dicDopi.Exists(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = True Then
           If dicDopi.Item(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = "ДОП НУЖЕН" Then

         ' данные для пременной "a" беру отсюдова: 
           a = CStr(tbl.Cells(lngRowIndex - 1, "D").Value)    
                  
            For k = Nachalo To lngKonec Step 1
           ' данные для переменной   kODvD беру здесь:
             KodVd = Val(ActiveSheet.Cells(k, 4).Value)
           ' В ОПРЕДЕЛЕННЫЙ МОМЕНТ УСЛОВИЕ ВЫПОЛНЯЕТСЯ: 9004109100 = 9004109100, 
            If KodVd = a Then
             Cells(k, 19) = Cells(k, 11)
         ' но код не видит , что условие выполнено, а постоянно пререходит на енд иф:
            End If
            Next
переменная KodVd возвращает значение 9004109100: KodVd = 9004109100,см. на фото:
переменная "a" возвращает значение "9004109100":  а = "9004109100", см. на фото:
т.е. после
Код
If KodVd = a Then
должна выполнятся
Код
Cells(k, 19) = Cells(k, 11)
а этого не происходит(
может потому-что
9004109100 <> "9004109100"??
есть идеи какие нить? как исправить?
Изменено: Домкрат - 28 Май 2020 15:34:03
 
Вы присмотритесь, они разные
 
vikttur, не вижу, тыкните пальцем, пожалуста.
 
Цитата
Домкрат написал: может потому-что 9004109100 <> "9004109100"?
Именно. текст<>число
Преобразовать текст в число или число в текст
1 & "" ="1"
Val("1") = 1 (для целых чисел)
CDbl, Int, двойное отрицание... Изучайте операторы
 
vikttur, в моём случае, как переменную а ? я  пробовал,- никак не получается.
Код
 a = CStr(tbl.Cells(lngRowIndex - 1, "D").Value)  

преобразовать в число, на моем примере можете подсказать?
Снимок28.PNG (22.94 КБ)
Изменено: Домкрат - 28 Май 2020 15:49:11
 
Цитата
Домкрат написал: a = CStr(...(
Об этом операторе читали чего-нибудь?
 
Цитата
vikttur написал:
Об этом операторе читали чего-нибудь?
возвращает строковые данные.
 
Цитата
vikttur написал:
Изучайте операторы
я так тоже могу ответить на ЛЮБОЙ  вопрос на форуме. спасибо за "помощь".
 
Домкрат, Вам основы изучать надо.
Цитата
Val("a") = a
Я Вам такого не советовал. В примере было о переводе текстовой записи числа в число. Вы пытаетесь перевести текст "а" в число...

А предложение почитать об операторах - как раз по теме.
 
Цитата
Домкрат написал:
может потому-что 9004109100 <> "9004109100"??
Это легко проверить.

Код
Sub test()  
Debug.Print 9004109100# <> "9004109100"
End Sub

Во всех версиях Excel результат False.

По картинке что-то сказать невозможно. Необходим пример.
Изменено: sokol92 - 28 Май 2020 16:01:27
Владимир
 
Цитата
vikttur написал:
Вам основы изучать надо.
Я сюда обращаюсь с конкртным примером, в конкретной строке кода, вместо помощи я получаю советы типа: "Вам основы изучать надо." и "Изучайте операторы"
-я вам по колхозному отвечу:

KodVd = "" & KodVd
это вам ниже собственного достоинства? гордость не позволяет помочь людям?
 
Вот именно что по колхозному...
Часто достаточно грамотно объявить переменные.
 
Да при чем здесь гордость?!
Помощь "на тарелочке" - это зачастую мкдвкежья услуга! Почему не хотите разобраться? Я Вам даю направление. Копайте, изучайте. Попутно узнаете много нового. Ан нет...

Val("a") = a - ну, прямо же подсказал. Не понимаете...
a - переменная, "a" - никакая не переменная, это текст. Хотите проверить, число ли в переменной, так и надо преобразовывать переменную:
Код
Dim b As Boolean
b= Val(a) = a


Цитата
KodVd = "" & KodVd
А так правильно. Если в переменной число, то станет текстом (но в случае, если переменная строковая)

Off. Похоже, в скором времени надо ждать 10 руб на кошелек  :)
 
Цитата
vikttur напесал:
Помощь "на тарелочке" - это зачастую мкдвкежья услуга!
хорошо, я пока поизучаю про строковые переменные, а вы пока вот ето за 10р. добъете?) там 10% осталось.
 
опа! в теме зашел разговор о 10р.
Код
            a = CStr(tbl.Cells(lngRowIndex - 1, "D").Value)                     
            For k = Nachalo To lngKonec Step 1
           ' данные для переменной   kODvD беру здесь:
             KodVd = CStr(ActiveSheet.Cells(k, 4).Value)
           ' В ОПРЕДЕЛЕННЫЙ МОМЕНТ УСЛОВИЕ ВЫПОЛНЯЕТСЯ: 9004109100 = 9004109100, 
            If KodVd = a Then
             Cells(k, 19) = Cells(k, 11)
         ' но код не видит , что условие выполнено, а постоянно пререходит на енд иф:
            End If
            Next
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
vikttur написал:
Val("1") = 1 (для целых чисел)
Вы наоборот всё написали.
вот рабочий вариант: 1 = Val(1)
не видать Вам червонца золотого.....Извините, но ничего личного. ТОЛЬКО ЧЕЛОВЕЧЕСКОЕ СПАСИБО.
123.PNG (13.14 КБ)
Изменено: Домкрат - 28 Май 2020 17:31:01
 
Цитата
Домкрат написал: вот рабочий вариант: 1 = Val(1)
Нет, это нерабочий вариант. Это всего лишь сравнение и если в таком виде напишете строку в коде, редактор попросит Вас исправить
 
Цитата
vikttur написал:
редактор попросит Вас исправить
чёт не просит:
 
Внимание! уникальный случай
Домкрат, переубедил редактор VBA как правильно писать код! редактор запросил пощады и сдался
редактор отрекся от ереси увидел и уверовал в истинный код!
(все, кто думал, что только Чак Норрис может обыграть стенку в тенис прошу критично пересмотреть свои взгляды)
у всех есть шанс на спасение, нужно только раскаяться и поверить в всепобеждающую силу Истинного Кода
Изменено: Ігор Гончаренко - 28 Май 2020 18:31:04
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, на таболе #18 показан конечный результат работы макросов, в #16 посте на фотке число без кавычек,- ко мне какие притензии?
Изменено: Домкрат - 28 Май 2020 18:31:32
 
Вы читаете, о чем вам пишут, или только свой код видите?
Цитата
вот рабочий вариант: 1 = Val(1)
Код
Sub text()
    1=Val(1))
End Sub

Я писал об этом. Ваш реактор такое пропустит?
 
Цитата
vikttur написал:
Ваш реактор такое пропустит?
нет.
А вот это пропустит:
a = Val(a) с еденицей я  указал для наглядности, что Вы наоборот написали. вот так: " Val("1") = 1" (для целых чисел), а надо было "1=Val("1")"
Вы же сами говорили, чтобы я изучал тему, вот я и изучил,- что вы с ошибкой дали код))
Изменено: Домкрат - 28 Май 2020 19:34:22
 
Да ничего наоборот не писал. Это была демонстрация, что чему равняется, а не строки кода!
Помогать Вам - только время терять...
 
Цитата
vikttur написал:
Это была демонстрация,
я догадался, но местами пришлось менять переменные, тогда и заработало.
Изменено: Домкрат - 28 Май 2020 19:36:26
 
Домкрат, Вы утверждаете, что запись Val("a") = a корректная?
 
Цитата
Юрий М написал:
Домкрат , Вы утверждаете, что запись Val("a") = a корректная?
я для кого фотки выкладываю с рабочим кодом? Там ясно видно что переменная возвращает ЧИСЛО а не текст, как было изначально. Вы код умеете читать, или только по губам?
123.PNG (13.14 КБ)
 
Я код читать уменю. И привёл вариант ВАШЕГО кода из #5. Правда, Вы всё больше рисунки нам показываете, вместо того, чтоб показывать именно код.

Теперь касательно этого:
Цитата
Домкрат написал:
Вы код умеете читать, или только по губам?
Извиниться не хотите?
 
Цитата
Юрий М написал:
Извиниться не хотите?
хочу, -ИЗВИНИТЕ;
-
Цитата
Юрий М написал:
И привёл вариант ВАШЕГО кода из #5
так там не работало, потому-что стояло изначально наоборот, как привел уважаемый викктур. Я после изучения темы поменял местами переменные и все заработало.
Цитата
Юрий М написал:
вместо того, чтоб показывать именно код.
вот он код, ещё не совсем почти готов, а так все рабочее.
Код
Sub Bijsumm()

    Main "Начало бижутерии", "Конец бижутерии"
End Sub

Private Sub Main(strStartPhrase As String, strEndPhrase As String)

    Dim sh_act As Worksheet, tbl As Range
    Dim dicDopi As Object
    Dim arrB()
    Dim arrBlankRows() As Long
    Dim lngRowIndex As Long
    Dim hr As Long, lr As Long, i As Long
    Dim KodVd As Variant, a As Variant
    Dim k As Integer
    Dim Nachalo As Integer, lngKonec As Integer
    

    Nachalo = НачалоДанных
    lngKonec = КонецДанных
    
    '1. Создание ссылки на активный лист.
    Set sh_act = ActiveSheet
    If sh_act Is Nothing Then
        Exit Sub
    End If
    ActiveSheet.name = "Апсны"
    With ActiveWorkbook.Sheets("Апсны").Tab
        .Color = 10092390
        .TintAndShade = 0
    End With
    '2. Поиск шапки и последней строки таблицы.
    S_Hr.Function2 sh_act, hr, lr
    
    '3. Копирование данных по допам из листа-надстройки в словарь "dicDopi".
    If BIJ_BIJ_SUM_2_GetAddin.Function1(dicDopi) = False Then
        Exit Sub
    End If
            
    '4. Создание ссылки на таблицу.
        ' Включение в таблицу строки после таблицы.
    Set tbl = sh_act.Rows(hr & ":" & lr + 1)
    
    '5.
    ' Копирование столбца B в массив "arrB".
    ' Подготовка данных к сравнению.
    arrB() = tbl.Columns("B").Value
    For i = 1 To UBound(arrB, 1) Step 1
        arrB(i, 1) = CStr(arrB(i, 1))
    Next i
    
    
    '6. Получение информации о пустых строках в массив "arrBlankRows".
    
    ReDim arrBlankRows(1 To 1)
    
    ' Первая строка - шапка.
    ' Во вторую строку не вставляется формула, но первая строка нужна
        ' для расчёта формулы в нижерасположенной пустой строке.
    For i = 2 To UBound(arrB, 1) Step 1
        ' Учитываются все пустые строки, т.к. надо будет потом вставлять формулы
            ' с учётом вышестоящих пустых строк.
        If arrB(i, 1) = "" Then
            arrBlankRows(UBound(arrBlankRows)) = i
            ReDim Preserve arrBlankRows(1 To UBound(arrBlankRows) + 1)
        End If
    Next i
    ' Если не было пустых ячеек в столбце B или была пустая ячейка только во второй строке,
        ' то дальше нет смысла что-то делать.
    If UBound(arrBlankRows) < 3 Then
        MsgBox "В таблице, в столбце ""B"" нет пустых ячеек. " & _
            "Макрос вставляет суммы в пустые ячейки.", vbExclamation
        Exit Sub
    End If
    ' Удаление последнего элемента из массива "arrBlankRows", который создавался заранее.
    ReDim Preserve arrBlankRows(1 To UBound(arrBlankRows) - 1)
    
    
    '7. Откл. монитора.
   ' Application.ScreenUpdating = False
    
    
    '8. Вставка формул.
    
    ' В массиве "arrBlankRows" могут находиться три вида пустых строк:
        '1) пустые строки с заголовками групп;
        '2) пустые строки, в которые не надо вставлять формулы;
        '3) пустые строки, в которые надо вставлять формулы.
    ' Первая пустая строка - это сразу после шапки таблицы. В неё не надо вставлять формулы.
    For i = 2 To UBound(arrBlankRows) Step 1
    
        ' Помещение порядкового номера Excel-строки в переменную для удобства.
        lngRowIndex = arrBlankRows(i)
        
        ' Пустые строки с заголовками групп пропускаем.
        ' Они определяются по двум подряд стоящим пустым строкам.
        If arrB(lngRowIndex - 1, 1) = "" Then
            ' Переход к следующей пустой строке.
            GoTo metka
        End If
        
        ' Если над пустой строкой через одну строку пусто, значит
            ' блок состоит из одной строки и формулы не надо вставлять.
        ' Сверху пустая строка может быть двух видов:
            ' 1) пустая строка с заголовком группы;
            ' 2) пустая строка между блоками.
            ' В любом случае действие будет одинаковое.
      

        If arrB(lngRowIndex - 2, 1) = "" Then
     
            ' В столбец "S" нужно вставлять данные на основе словаря "dicDopi".
            If dicDopi.Exists(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = True Then
                If dicDopi.Item(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = "ДОП НУЖЕН" Then
                
'                    With tbl.Cells(lngRowIndex - 1, "S")
'                        .Value = tbl.Cells(lngRowIndex - 1, "K").Value
'                        ' Форматирование.
'                        .Interior.Color = 65535
'                        '.BorderAround xlContinuous!!!нахуй нужны бордюры!!!
'
'                    End With
                End If
            End If
           
        ' Если сверху над пустой строкой несколько непустых строк, то
            ' вставка формул (формулы проще вставить, чем рассчитывать с помощью макроса).
        Else
       
            tbl.Cells(lngRowIndex, "K").FormulaR1C1 = _
                "=ROUND(SUM(R[-" & lngRowIndex - arrBlankRows(i - 1) - 1 & "]C:R[-1]C),2)"
            tbl.Cells(lngRowIndex, "N").Resize(1, 2).FormulaR1C1 = _
                "=ROUND(SUM(R[-" & lngRowIndex - arrBlankRows(i - 1) - 1 & "]C:R[-1]C),2)"
            tbl.Cells(lngRowIndex, "R").FormulaR1C1 = _
                "=ROUND(SUM(R[-" & lngRowIndex - arrBlankRows(i - 1) - 1 & "]C:R[-1]C),2)"
            ' Выделение цветом.
            tbl.Cells(lngRowIndex, "K").Resize(1, 8).Interior.Color = 65535
        
            
'            ' В столбец "S" нужно вставлять данные на основе словаря "dicDopi".
           If dicDopi.Exists(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = True Then
           If dicDopi.Item(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = "ДОП НУЖЕН" Then
           a = CStr(tbl.Cells(lngRowIndex - 1, "D").Value) '
           'переводим текстовый в числовой:
           ' это числовой в текстовый:
           'KodVd = "" & KodVd
           a = Val(a)
           
          
            ' допы простовляем напротив каждой. ибо нех.
            For k = Nachalo To lngKonec Step 1
            KodVd = Val(ActiveSheet.Cells(k, 4).Value)
        
            If KodVd = a Then
            Cells(k, 19) = Cells(k, 11)
            With Cells(k, "S")
                       .HorizontalAlignment = xlCenter
                       .BorderAround xlContinuous '!!!нахуй нужны бордюры!!!
                    End With
            End If
            Next
            
              ' вот здесь в столбце S будет суммировать промежуточные итоги:
               tbl.Cells(lngRowIndex, "S").FormulaR1C1 = _
                "=ROUND(SUM(R[-" & lngRowIndex - arrBlankRows(i - 1) - 1 & "]C:R[-1]C),2)"
                With tbl.Cells(lngRowIndex, "S")
'                        .Value = tbl.Cells(lngRowIndex, "K").Value  ' это значение из столбца K одставляеться, а мне нужно , чтоли суммироувало
                       .Interior.Color = 65535
                       .HorizontalAlignment = xlCenter
                       .Font.Bold = True
                       .BorderAround xlContinuous '!!!нахуй нужны бордюры!!!
                    End With
'
           ' это значение из столбца K подставляться:
           
'
            ' это ориганальный код:
'            ' В столбец "S" нужно вставлять данные на основе словаря "dicDopi".
'            If dicDopi.Exists(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = True Then
'               If dicDopi.Item(key:=CStr(tbl.Cells(lngRowIndex - 1, "D"))) = "ДОП НУЖЕН" Then
'                         With tbl.Cells(lngRowIndex, "S")
'                        .Value = tbl.Cells(lngRowIndex, "K").Value ' это значение из столбца K одставляеться, а мне нужно , чтоли суммироувало
'                        .Interior.Color = 65535
'                        .BorderAround xlContinuous '!!!нахуй нужны бордюры!!!
'                    End With
                End If
          End If
          End If
      
    
metka:
    Next i
  
    '9. Создание справа таблицы с кол-вом мест.
    'S_KOLMEST_1_CreateTbl.Main sh_act
    
    '10. Включение обновления монитора.
    'Application.ScreenUpdating = True
    
End Sub



Изменено: Домкрат - 28 Май 2020 19:58:18
 
Домкрат, давайте иначе: не нужен такой огромный листинг. Не нужна никакая таблица с данными. Набросайте малюсенький код в таком стиле:
Код
Sub qqq()
    a = 123
    b = "123"
     Debug.Print a = b
     Debug.Print a = Val(b)
End Sub
и покажите, какие ДВЕ переменные (как в названии темы) не равны друг другу.
 
Юрий М, эти не равны: a = b . вроде уже всё выяснили, в этой теме. теперь код слишком велИк получается...
Код
Sub qqq()
    a = 123
    b = "123"
     Debug.Print a = b 'False
     Debug.Print a = Val(b) 'True
End Sub
Изменено: Домкрат - 28 Май 2020 20:11:09
Страницы: 1 2 След.
Читают тему (гостей: 1)
Наверх