Перейти к содержимому

Фотография

Excelпомощь, консультации...


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 914

#361
vladimir55

vladimir55
  • Постоялец
  • 401 сообщений

Привет! Уже долго учусь ВБА, но пока слаб.

Сделал один тестовый пример, в целом всё функционирует, но значения видит не верно.

То есть условие - если Н > 0.5, то "Вася" в ином случае "Ваня" - так вот Эксель постоянно ставит Ваню

 

Добавил во вложение. Посоветуйте пожалуйста.

Благодарю

А если внести присвоение значения переменной а в цикл?

Т.е. поменять 2 строчки местами. Было:

a = ...

FOR ...

Стало:

FOR ...

a = ...


Сообщение отредактировал vladimir55: 05.08.2013, 01:59:38

  • 0

#362
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений
Sub test()
Dim a(), c(), i&
    Application.ScreenUpdating = False
    
    With Sheets("Лист1")
        a = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value'диапазон
        
        ReDim c(1 To UBound(a), 1 To 1)
        
        For i = 1 To UBound(a)'цикл
            If a(i, 1) > 0.5 Then'усл.
                c(i, 1) = "Вася"
                Else: c(i, 1) = "Ваня"
            End If
        Next
        .[B2].Resize(i - 1, 1).Value = c'результат
    End With
    
    Application.ScreenUpdating = True
End Sub

Сообщение отредактировал DauletAhamanov: 05.08.2013, 08:37:42

  • 1

#363
Nigrum cygnum

Nigrum cygnum
  • В доску свой
  • 1 201 сообщений
Sub test()

End Sub

 

Спасибо! Всё классно работает, сейчас в своем коде разберусь, сделаю так, чтобы и он работал :)

ЗЫ Зашел на сайт - посмотрел работы  :kruto:  классно.

Особенно то, что код не запаролен, можно будет поучиться!

 

 

А если внести присвоение значения переменной а в цикл?

 

 

Т.е. поменять 2 строчки местами. Было:

a = ...

FOR ...

Стало:

FOR ...

a = ...

 

 

Не работает)


Сообщение отредактировал Nigrum cygnum: 05.08.2013, 21:14:15

  • 0

#364
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений

переменную a внутри цикла надо вставить, а то у Вас с наружий запоминает a=0.54 и до конца цикла

For i = 1 To 100
a = ActiveCell.Offset(0, 0).Range("A1")
If a > 0.5 Then

Сообщение отредактировал DauletAhamanov: 06.08.2013, 09:41:05

  • 0

#365
Нурия Кисметова

Нурия Кисметова
  • Случайный прохожий
  • 1 сообщений

Здравствуйте, по роду своей деятельности много работаю в Excel.

Готов поделиться своим опытом и перенять чужой.

Здравствуйте,

срочно нужен специалист по написанию макросов в excel для серьезной компании в Астане 87172 55 84 63


  • 0

#366
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений

срочно нужен специалист по написанию макросов в excel для серьезной компании в Астане

Здравствуйте!

А что через смс (Skype, email и т.д.) не как?


  • 0

#367
qashqai

qashqai
  • В доску свой
  • 1 699 сообщений

Все привет!
Второй день бъюсь над задачей по обработке отфильтрованных строк. Проблема в том что не могу программно сосчитать точное их кол-во. К примеру, когда в таблице задаю фильтр (по 3-м значениям), то Эксель отфильтровывает 14 строк. Далее пытаюсь программно определить сколько же Эксель отфильтровал или хотя бы определить адреса этих строк. В пером случае код такой:

 

Sub Ìàêðîñ9()

Dim rCopyRange As Range
Set rCopyRange = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _
       ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)

   For iCol = 1 To rCopyRange.Columns.Count
        li = 0
        le = 0
        'lCount = 0
        'le = iCol - 1
        For Each rCell In rCopyRange.Columns(iCol).Cells
                'If ActiveCell.Offset(li, le).EntireColumn.Hidden = False And ActiveCell.Offset(li, le).EntireRow.Hidden = False Then
                    MsgBox ActiveCell.Offset(li, le).Value
                    lCount = lCount + 1
                'End If
                li = li + 1

        Next rCell
                        le = le + 1
    Next iCol

End Sub

 

Задаю в Wathes выражение ActiveSheet.AutoFilter.Range.Rows.SpecialCells(xlCellTypeVisible), которое в свойстве Value2 показывает только 7 строк (по таблице первые семь) отфильтрованных строк. Куда остальные 7 строк девалоь не понятно.

 

во втором случае пытаюсь определить адреса отфильтрованных строк следующим кодом:

Sub Ìàêðîñ5()
'
' Ìàêðîñ5 Ìàêðîñ
'

  
    Set filter_range = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _
       ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)
      
   
    strRange = filter_range.Address
    mystr = Replace(strRange, "$", "", 1)
    b = Len(mystr)
    c1 = 1
    i = 0
    Do
         If InStr(1, mystr, ":") > 0 Then
            If InStr(c1, mystr, ",") > 0 Then
                c = Left(mystr, InStr(c1, mystr, ",") - 1)
            Else
                c = mystr
            End If
            c2 = Val(Replace(c, ":", " ", 1))
            v1 = Right(Left(c, InStr(1, c, ":") - 1), Len(Left(c, InStr(1, c, ":") - 1)) - 1)
            v2 = Right(Right(c, InStr(1, c, ":") - 1), Len(Right(c, InStr(1, c, ":") - 1)) - 1)
            c1 = Len© + 1
            cc = Len(mystr) - Len(c1)
            d = Left(c, InStr(1, c, ":") - 1)

            mystr = Mid(mystr, c1 + 1, Len(mystr))
            If mystr = "" Then Exit Do
            i = i + 1
            MsgBox mystr
            bbb = filter_range.Count
         Else
            Exit Do
         End If
    Loop Until InStr(1, mystr, ":") = 0

 MsgBox CStr(i)   
   
End Sub

 

Данный код (переменная mystr) позволяет получить диапозон адресов отфильтрованных сток. В нашем случае такой "A11:P11,A13:P13,A15:P16,A18:P18,A24:P25". Если посчитать то опять имеем только 7 строк.

 

Вообщем, где ошибка? как получить 14 строк?


  • 0

#368
qashqai

qashqai
  • В доску свой
  • 1 699 сообщений
Изображение
См. Пример отфильтрованных 14 строк.
  • 0

#369
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений

Здравствуйте qashqai, Вам нужен по определенному столбцу фильтр по нескольким критериям? или коль-во строк? файл залейте посмотрим (не оригинал файл - с изм.), а то Вашем коде использовано текстовые функции (Left, Mid и т.д.)


  • 0

#370
qashqai

qashqai
  • В доску свой
  • 1 699 сообщений

Здравствуйте qashqai, Вам нужен по определенному столбцу фильтр по нескольким критериям? или коль-во строк? файл залейте посмотрим (не оригинал файл - с изм.), а то Вашем коде использовано текстовые функции (Left, Mid и т.д.)

 

отправил на ahamanov.daulet@gmail.com. Через форум не получилось, не разобрался как крепить файлы - черт ногу сломит. :faceoff:


  • 0

#371
qashqai

qashqai
  • В доску свой
  • 1 699 сообщений

Сегодня еще раз тестировал наработки получилось такое решение

Sub Ìàêðîñ13()
    Set filter_range = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _
       ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)
      
    'Set filter_range = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
   
    i = 0
    y = 0
    myStr = ""
   
    For Each Cel In filter_range 'ïåðåáîð âñåõ ÿ÷ååê â äèàïàçîíå
        i = i + 1
        myStr = myStr + CStr(Cel.Value) + " "
        If i = 16 Then
            y = y + 1
            i = 0
            MsgBox myStr + Chr(10) + Chr(13)
        End If

     'MsgBox cel(i, 1).Value
    'MsgBox CStr(Cel.Value) + " " + CStr(Cel.Address)
    Next
   
  MsgBox CStr(y)
   
End Sub

 

по коду получается:

1. имею значение каждой ячейки выбранного диапозона

2. знаю точный адрес ячейки отфильтрованной строки

3. и точное кол-во отфильтрованных строк

 

в принципе этого вполне достаточно :)


  • 0

#372
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений

Sub Макрос13()
    Set filter_range = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _
       ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)    
    For Each Cel In filter_range 'перебор всех ячеек в диапазоне
        myStr = myStr & CStr(Cel.Value) & " ": y = y + 1
    Next
  MsgBox myStr & Chr(10) & "Кол-во строк " & CStr(y) / 16
End Sub

копируйте на русском раскладке, для прикрепление файла, Вам нужен за архивировать файл, и тогда же...


Сообщение отредактировал DauletAhamanov: 14.09.2013, 16:14:47

  • 0

#373
qashqai

qashqai
  • В доску свой
  • 1 699 сообщений

Добавлю - чтобы получить адрес ячейки в вышеупомянутом коде используйте выражение Cel.Address


Сообщение отредактировал qashqai: 14.09.2013, 17:06:35

  • 0

#374
Nigrum cygnum

Nigrum cygnum
  • В доску свой
  • 1 201 сообщений

Привет снова всем, в особенности гос-ну Ахаманову  :dandy:

 

Вопрос такой - каков синтаксис переменных при использовании в циклах?

 

То есть : 

 

 

Sub main2new()

Dim dt1 As Date
Dim dt2 As Date
Dim dt3 As Date
Dim dtn As Date
Dim i As Integer
 
dt1 = "01.10.2011"
dt2 = "01.01.2012"
dt3 = "01.04.2012"
 
For i = 1 To 3
dtn = dt & i
Workbooks("Test(15sep13)_m2.xlsm").Activate
    Sheets("main").Select
    Range("A5").Value = dtn
    Sheets("main").Select
    Range("A:L").Select
    Selection.Copy
    Workbooks("Book1.xlsx").Activate
    Sheets("Лист" & i).Select
    Range("A1").Select
    ActiveSheet.Paste
    
Next i
End Sub

 

Проблема в том, что я не могу использовать dt & i или "dt" + i

В общем голову сломал - не получается цикл  :faceoff:

 

Или может ещё переменную ввести?


Сообщение отредактировал Nigrum cygnum: 16.09.2013, 21:19:45

  • 0

#375
Заинтересованная

Заинтересованная
  • В доску свой
  • 2 431 сообщений

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


  • 0

#376
vladimir55

vladimir55
  • Постоялец
  • 401 сообщений


Привет снова всем, в особенности гос-ну Ахаманову  :dandy:

 

Вопрос такой - каков синтаксис переменных при использовании в циклах?

 

То есть : 

 


 

Sub main2new()

Dim dt1 As Date
Dim dt2 As Date
Dim dt3 As Date
Dim dtn As Date
Dim i As Integer
 
dt1 = "01.10.2011"
dt2 = "01.01.2012"
dt3 = "01.04.2012"
 
For i = 1 To 3
dtn = dt & i
Workbooks("Test(15sep13)_m2.xlsm").Activate
    Sheets("main").Select
    Range("A5").Value = dtn
    Sheets("main").Select
    Range("A:L").Select
    Selection.Copy
    Workbooks("Book1.xlsx").Activate
    Sheets("Лист" & i).Select
    Range("A1").Select
    ActiveSheet.Paste
    
Next i
End Sub

 

Проблема в том, что я не могу использовать dt & i или "dt" + i

В общем голову сломал - не получается цикл  :faceoff:

 

Или может ещё переменную ввести?

Долго не мог понять, что же Вы хотите.

Вы в цикле хотите получать в dtn дату из dt1, dt2 или dt3, номер определяется переменной i. Правильно?

Если так, то почему не объявить массив dt(3):

 

dim dt(3) as Date

...

dt[1] = "01.10.2011"
dt[2] = "01.01.2012"
dt[3] = "01.04.2012"
 
for i = 1 to 3
  dtn = dt[i]
...
 
Хотя, в операции dtn = dt[i] уже не будет необходимости, дальше можно будет использовать просто обращение к элементу массива - dt[i].
 
А Вы пытаетесь подставить в место имени переменной строковое значение dt & i - эта операция делает объединенную строку из значений переменных dt и i. При этом dt у Вас не объявлена.
 

 



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

 

Нужно стать немножко программистом.

Не знаю как лучше. Может быть на курсы пойти, а может приобрести самоучитель.

Начать нужно с понимания таких определений как переменные, константы, типы, операторы, управляющие конструкции, функции и т.д.

Можно начать с поиска в сети информации по VBA. Например, VBA переменные

 

P.S. Сам я ниразу не специалист по VBA, но программы составлять умею


Сообщение отредактировал vladimir55: 17.09.2013, 03:12:26

  • 0

#377
Nigrum cygnum

Nigrum cygnum
  • В доску свой
  • 1 201 сообщений


Долго не мог понять, что же Вы хотите.

Вы в цикле хотите получать в dtn дату из dt1, dt2 или dt3, номер определяется переменной i. Правильно?

Если так, то почему не объявить массив dt(3):

 

dim dt(3) as Date

...

dt[1] = "01.10.2011"
dt[2] = "01.01.2012"
dt[3] = "01.04.2012"
 
for i = 1 to 3
  dtn = dt[i]
...
 
Хотя, в операции dtn = dt[i] уже не будет необходимости, дальше можно будет использовать просто обращение к элементу массива - dt[i].
 
А Вы пытаетесь подставить в место имени переменной строковое значение dt & i - эта операция делает объединенную строку из значений переменных dt и i. При этом dt у Вас не объявлена.

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


  • 0

#378
Nigrum cygnum

Nigrum cygnum
  • В доску свой
  • 1 201 сообщений


dim dt(3) as Date

...

dt[1] = "01.10.2011"
dt[2] = "01.01.2012"
dt[3] = "01.04.2012"
 
for i = 1 to 3
  dtn = dt[i]
...
 
Хотя, в операции dtn = dt[i] уже не будет необходимости, дальше можно будет использовать просто обращение к элементу массива - dt[i].

 При использовании квадратных скобок выдавало постоянно ошибку - изменил на круглые, всё отлично работает!  :bow:


  • 0

#379
Заинтересованная

Заинтересованная
  • В доску свой
  • 2 431 сообщений
Вот нашла какие то http://www.intuit.ru...es/536/392/info Пойдут?
  • 0

#380
Daulet.tech

Daulet.tech
  • Завсегдатай
  • 239 сообщений

Что то уведомление поздно приходить :(, если использовать массив (Array), то тогда в цикл начинается с 0, а не с 1, в моем варианте

Sub main2new()
    Dim dt, i As Integer
    dt = Array("01.10.2011", "01.01.2012", "01.04.2012")
    For i = 0 To 2
        MsgBox CDate(dt(i))' + 1
    Next
End Sub

Сообщение отредактировал DauletAhamanov: 17.09.2013, 15:13:04

  • 0


Количество пользователей, читающих эту тему: 2

пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.