Страницы: 1 2 След.
RSS
Цикл по перебору столбцов
 
Здравствуйте, подскажите, пожалуйста, как можно сделать цикл с перебором столбцов и выход в том случае, если столбец пуст??? То есть можно ли как-то узнать по порядковому номеру столбца его букву??  
Спасибо!
 
Перебор столбцов в использованной области активного листа:  
 
For each st in ActiveSheet.UsedRange.Columns  
   Debug.Print st.Column  
Next st  
 
перебор с выходом если столбец пуст:  
 
For each st in ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 then    
       Debug.Print st.Column  
       Exit For  
   End if  
Next st  
 
перебор с выходом и определением буквы столбца (бесполезная для VBA информация):  
 
For Each st In ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 Then  
       Debug.Print Replace(Split(st.EntireColumn.Address, ":")(0), "$", "")  
       Exit For  
   End If  
Next st
 
Спасибо, конечно, но как-то можно проще сделать мне кажется. Сейчас пробую с помощью    
 
 
Worksheets("Лист1").Cells(k, I).Value  
 
И вот такой вопрос. Поставила условие проверки пустоты ячейки:  
 
If IsNull(Worksheets("Лист1").Cells(k, I).Value) Then  
 
А почему-то если ячейка пустая, то это условие становится в False, хотя должно в True. Можете подсказать почему?  
Впринципе можно использовать IsEmpty...Но это же аналогично..  
И еще почему-то не срабатывает условие  
 
If IsDate(Worksheets("Лист1").Cells(k, I).Value) Then  
 
Не пойму в чем проблема. Подскажите, пожалуйста!!!
 
оно, конечно, аналогично, но не идентично..  
IsNull Function  
       
 
Returns a Boolean value that indicates whether an expression contains no valid data (Null).  
 
Syntax  
 
IsNull(expression)  
 
The required expression argument is a Variant containing a numeric expression or string expression.  
 
Remarks  
 
IsNull returns True if expression is Null; otherwise, IsNull returns False. If expression consists of more than one variable, Null in any constituent variable causes True to be returned for the entire expression.  
 
The Null value indicates that the Variant contains no valid data.    
 
 
 
Null is not the same as Empty!!!  
 
 
, which indicates that a variable has not yet been initialized. It is also not the same as a zero-length string (""), which is sometimes referred to as a null string.  
 
Important   Use the IsNull function to determine whether an expression contains a Null value. Expressions that you might expect to evaluate to True under some circumstances, such as If Var = Null and If Var <> Null, are always False. This is because any expression containing a Null is itself Null and, therefore, False.
 
{quote}{login=slan}{date=29.01.2008 01:20}{thema=}{post}оно, конечно, аналогично, но не идентично..  
IsNull Function{/post}{/quote}  
А если не секрет, откуда такая информация? Я тоже хочу почитать :)  
 
И все-таки, а что с IsDate не то?
 
есть такая кнопка... f1 :)
 
{quote}{login=slan}{date=29.01.2008 02:01}{thema=}{post}есть такая кнопка... f1 :){/post}{/quote}  
 
Но почему-то у меня меньше там написано :(  
Вопрос с IsDate остался не решен :(
 
Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?
 
{quote}{login=Sonia}{date=29.01.2008 04:19}{thema=}{post}Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?{/post}{/quote}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? "1" в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets("Лист1").Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.
 
{quote}{login=}{date=29.01.2008 06:55}{thema=Re: }{post}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? "1" в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets("Лист1").Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.{/post}{/quote}  
 
Дело в том, что я не знаю в каком столбце у меня будет дата изначально. Данные выгружаются в Excel из программы и может получиться разное количество столбцов (так вот криво работают вместе эта программа и Excel). А я пишу макрос, который переписывает нужные данные в соответствующие поля, а остальные затирает. Так вот, мне надо узнать, если в столбце сожержится дата, то переписать ее в столбец с датой. Впринципе можно как-то маску использовать, можете подсказать функцию проверки на сооветствие данных ячейки конкретной маске???
 
А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил - он все сам нашел.
 
{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил - он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют
 
{quote}{login=Sonia}{date=30.01.2008 09:39}  
Впринципе можно как-то маску использовать, можете подсказать функцию проверки на сооветствие данных ячейки конкретной маске???{/post}{/quote}  
 
может это подойдёт  
If (CStr(Range("A30").Offset(0, K)) Like "*.*.*") then  
НомерСтолбцаДаты = K+1  
end if
 
{quote}{login=Sonia}{date=30.01.2008 11:44}{thema=Re: }{post}{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил - он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют{/post}{/quote}Форма екселевская, в том же файле?  
Может пример прикрепите?
 
{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  
 
Форма на том же листе. Выкладываю пример.
 
{quote}{login=Sonia}{date=30.01.2008 02:10}{thema=Re: Re: Re: }{post}{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  
 
Форма на том же листе. Выкладываю пример.{/post}{/quote}  
 
А где пример? Почему то не подцепился...
 
Ой, сорри, подцепился. Макрос там же.
 
Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
 
 
k = 20 ' Начало со столбца T  
   Do  
   ' Сделано для корректного переноса Примечаний, включающих символ ";"  
     If Worksheets("Лист1").Cells(I, k).Value Like "??.??.*" Then  
              Range("I" + CStr(I)) = Worksheets("Лист1").Cells(I, k).Value  
     Else  
        If Not (Worksheets("Лист1").Cells(I, k).Value = "") Then  
           Range("H" + CStr(I)) = Range("H" + CStr(I)) + ";" + Worksheets("Лист1").Cells(I, k).Value  
        End If  
        'Range("I" + CStr(I)) = Worksheets("Лист1").Cells(k + 1, I).Value  
     End If  
     
     
   'Worksheets("Лист1").Cells(I, k).Value = Empty  
         
   k = k + 1  
     
   Loop Until Worksheets("Лист1").Cells(I, k).Value = ""
 
Насколько я понял задача заключается в следующем    
для строки первые N столбцов копируются,  
если дальнейшие столбцы не пусты, то если в столбце находится дата она записывается в ячейку для даты, а если какие то данные то они добавляются к содержимому ячейки примечание, и так пока в столбце не окажется пусто.  
 
Вопрос Последняя значащая ячейка в строке обязательно дата?  
и кроме нее в обрабатываемом участке строки дат нет?
 
{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  
 
Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  
 
Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) - дата документа.
 
{quote}{login=ДЛ}  
If Worksheets("Лист1").Cells(I, k).Value Like "??.??.*" Then  
{/post}{/quote}  
А разве маска так пишется??? Я думала, что-то типа: "dd.mm.yyyy"??
 
"dd.mm.yyyy" - это формат  
А маска - это определенные символы (в Вашем случае точки) и "?" как любой один символ, а "*" как любые символы.
 
{quote}{login=Sonia}{date=30.01.2008 04:57}{thema=Re: }{post}{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  
 
Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  
 
Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) - дата документа.{/post}{/quote}  
 
Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  
   
Worksheets("Лист1").Cells(I, k).Address  
Worksheets("Лист1").Cells(k, I).Address  
 
Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  
 
Но всё таки поробавпли заменить или нет?  
Если заменили работает?
 
{quote}  
Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  
   
Worksheets("Лист1").Cells(I, k).Address  
Worksheets("Лист1").Cells(k, I).Address  
 
Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  
 
Но всё таки поробавпли заменить или нет?  
Если заменили работает?{/post}{/quote}  
 
Да, заменила. Спасибо большое!!!! Все работает!! :) Сейчас еще пошагово пробегусь и Watch посмотрю, чтобы окончательно разобраться ;)
 
{quote}{login=}{date=31.01.2008 07:42}{thema=Re: Re:}{post}  
Worksheets("Лист1").Cells(I, k).Address  
{/post}{/quote}  
 
Хм...а я считала, что в Cells сначала указывается столбец, а потом строка...оказалось наоборот. Ладно, буду знать :)
 
Решил что эта тема подходит к моему вопросу.  
Вопрос-    
Как в екселе заменить пустоту "" на null? т.е. есть ячайки без данных но не пустые
 
Вы, видимо, хотите очистить ячейки?  
 
if MyCell="" then MyCell.ClearContents 'очистить содержимое, сохранить форматирование  
 
if MyCell="" then MyCell.Clear 'очистить содержимое и форматирование
 
{quote}{login=Казанский}{date=24.01.2011 11:21}{thema=Cross}{post}Вы, видимо, хотите очистить ячейки?  
 
if MyCell="" then MyCell.ClearContents 'очистить содержимое, сохранить форматирование  
 
if MyCell="" then MyCell.Clear 'очистить содержимое и форматирование{/post}{/quote}  
Очень похоже на правду. только не понял как его правильно использывать. через поиск или объявлением таблици. Я в ВБА полный нуб, только осваиваюсь. Начинаю с простого "запись макроса". стоп макрос. потом смотрю код и начинаю его оптимизировать - так и развиваюсь...((
 
Попробуйте - обработка выделенного диапазона, очистка пустых на вид ячеек, которые содержат "" как значение формулы либо полученные копированием-вставкой значения таких ячеек.  
После обработки пустые ячейки выделяются по команде F5 - выделить - пустые ячейки.    
 
Sub Cross()  
Dim MyCell As Range  
For Each MyCell In Selection 'то же, что Selection.Cells  
   If MyCell = "" Then MyCell.ClearContents  
Next ' то же, что Next MyCell  
End Sub
 
{quote}{login=Cross}{date=24.01.2011 11:12}{thema=}{post}Решил что эта тема подходит к моему вопросу. Вопрос- Как в екселе заменить пустоту "" на null? т.е. есть ячайки без данных но не пустые{/post}{/quote}  
Перечитал название темы - "Цикл по перебору столбцов". Что,- действительно подходит?
Страницы: 1 2 След.
Читают тему
Наверх