Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ишибка Rows.Count
 
 автор: Мишок   (16.01.2014 в 18:23)   личное сообщение
 
 

здравствуйте
не могу понять, повторный запуск
lLastRow = Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row
выдает ошибку, т.к получается строк 65536
в чем ошибка?

  Ответить  
 
 автор: osmor   (17.01.2014 в 12:41)   личное сообщение
 
 

вопрос не понятен. И что вы пытаетесь сделать?
что по вашему значит конструкция
Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row ?

  Ответить  
 
 автор: Мишок   (17.01.2014 в 13:00)   личное сообщение
 
 

ищу в exel последнюю запись

Set objExcel = CreateObject("Excel.application")
With objExcel
    .Workbooks.Open fileName:=sse, ReadOnly:=False
    .Visible = True
    lLastRow = Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row
   ' MsgBox lLastRow + 1
    .Sheets(1).Range("C" & lLastRow + 1).Value = FIO
end with

  Ответить  
 
 автор: час   (17.01.2014 в 13:44)   личное сообщение
 
 

а где цикл?
и условие выхода из цикла?
надо написать

for F=1 to 65536

if lLastRow >= 65535 then Exit for ' goto "на фиг"
или 
if .Sheets(1).Range("C" & F).Value = ""  then Exit for ' goto "на фиг"
next F

  Ответить  
 
 автор: Мишок   (17.01.2014 в 13:57)   личное сообщение
 
 

так в том-то и дело, что строк всего 5-10,
при первом запуске, все ОК, а в следуюций он находит аж 65536 строк

  Ответить  
 
 автор: час   (17.01.2014 в 14:12)   личное сообщение
 
 

ЗАДАЙ УСЛОВИЕ ВЫХОДА ИЗ ЭТОГО ПОИСКА-ЦИКЛА И ПРОБЛЕМОВ НЕ БУДЕТ.

  Ответить  
 
 автор: osmor   (17.01.2014 в 15:13)   личное сообщение
 
 

ищу в exel последнюю запись


никогда корректно не работал такой способ, т.е. вероятность ошибки очень велика.
т.к. Excel как-то сам по себе определяет последнюю ячейку. Например если заполнить 1 строку, потом перейти на 1000 строку и нажать Enter ничего не вводя, то excel будет считать что строк 1000.
Вероятно вы при первом проходе обращаетесь к ячейкам (даже ничего не вводя в них).
Считайте заполненные строки и столбцы "руками". т.е. следите сами сколько строк и ячеек заполнили.

  Ответить  
 
 автор: Мишок   (20.01.2014 в 12:24)   личное сообщение
 
 

спасибо, понял.
может можно как-то чистить память чтобы приповторном обращении считал правильно?

  Ответить  
 
 автор: Вакшуль Сергей   (20.01.2014 в 12:52)   личное сообщение
 
 

Добрый день,

Всего вашего кода не видно, но:

Вы создаете переменную типа Application по идее для того, чтобы потом от нее плясать. Т.е. открывать/создавать Workbooks, для которых созданный вами Excel.Application будет родительским объектом.
Посмотрите, что у вас здесь:
lLastRow = Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row
перед Sheet у вас нет вашей переменной.
Здесь тоже не однозначно:
.Sheets(1).Range("C" & lLastRow + 1).Value = FIO
Я к тому, что лучше переписать код четко:


Dim wb As Excel.Workbook
    Set wb = objExcel.Workbooks.Open ..............
    lLastRow = wb.Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row
    wb.Sheets(1).Range("C" & lLastRow + 1).Value = "FIO"


Попробуйте переделать с четкой иерархией. По-моему, должно работать.

  Ответить  
 
 автор: Мишок   (22.01.2014 в 13:27)   личное сообщение
 
 

к сожелению так тоже не работает :(
сделал просто простоцикл как советовал час.

  Ответить  
 
 автор: Вакшуль Сергей   (22.01.2014 в 16:05)   личное сообщение
 
 

можете показать код целиком?

  Ответить  
 
 автор: Вакшуль Сергей   (23.01.2014 в 20:05)   личное сообщение
 
 

жаль, что нет уведомлений о сообщении,
мониторить форум без конца не могу. От темы отключаюсь

Цикл по всем строкам не нужен. Тем более, что в xls и xlsx файлах количество строк разное.
Если уже и просматривать, то тогда диапазон UsedRange. Но и это не нужно. Нужно было просто код отладить.

  Ответить  
 
 автор: Мишок   (24.01.2014 в 16:48)   личное сообщение
 
 

Вакшуль Сергей , огромное Вам спасибо. Вы правы об отладке кода.
код был такй

   Dim lLastRow As Long
   Dim lLastCol As Long
 Dim objExcel As Object, sse As String
sse = "X:\Groups\МС.xls"
 
Set objExcel = CreateObject("Excel.application")
With objExcel
    .Workbooks.Open fileName:=sse, ReadOnly:=False
    .Visible = True
    lLastRow = Cells(Rows.Count, 3).End(xlUp).Row
   ' MsgBox lLastRow + 1
    .Sheets(1).Range("C" & lLastRow + 1).Value = ФамилияЛат & ИмяЛат
    .Sheets(1).Range("F" & lLastRow + 1).Value = Заказчик
    .Sheets(1).Range("D" & lLastRow + 1).Value = krat
    If Len(Примечания) > 0 Then
    .Sheets(1).Range("C" & lLastRow + 1).AddComment ' примечание
    .Sheets(1).Range("C" & lLastRow + 1).Comment.Visible = False '' примечание
    .Sheets(1).Range("C" & lLastRow + 1).Comment.Text Text:=Chr(34) & Примечания & Chr(34)   ' примечание
    End If
  End With
   
Set objExcel = Nothing

  Ответить  
 
 автор: Вакшуль Сергей   (24.01.2014 в 20:29)   личное сообщение
 
 

Добрый вечер,

Сделал тестовую процедуру(чтобы выполнить код поставьте ссылку на библиотеку Excel):


Sub test()
Dim lLastRow As Long
Dim lLastCol As Long
Dim objExcel As Excel.Application
Dim sse As String
Dim wb As Excel.Workbook
Dim wsh As Excel.Worksheet
sse = "C:\Users\Vakshul\Documents\Книга2.xlsx"
  
Set objExcel = CreateObject("Excel.application")
objExcel.Visible = True
Set wb = objExcel.Workbooks.Open(FileName:=sse, ReadOnly:=False)
Set wsh = wb.Worksheets(1)
With wsh
    lLastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
    .Range("C" & lLastRow + 1).Value = "ФамилияЛат"
    .Range("F" & lLastRow + 1).Value = "Заказчик"
    .Range("D" & lLastRow + 1).Value = "krat"
    '    If Len(Примечания) > 0 Then
        .Range("C" & lLastRow + 1).AddComment ' примечание
        .Range("C" & lLastRow + 1).Comment.Visible = False '' примечание
        .Range("C" & lLastRow + 1).Comment.Text Text:=Chr(34) & "Примечания" & Chr(34)   ' примечание
    '    End If
  End With
Set objExcel = Nothing
End Sub


код работает стабильно. Office 2010

В прошлый раз, когда я говорил о четкой иерархии и привел пример:
lLastRow = wb.Sheets(1).Cells(Sheets(1).Rows.Count, 3).End(xlUp).Row
я просто обозначил направление. Думал, вы доделаете.

Выделил жирным пропущенный кусок.
lLastRow = wb.Sheets(1).Cells(wb.Sheets(1).Rows.Count, 3).End(xlUp).Row

В общем, все работает.

Сергей

  Ответить  
 
 автор: Мишок   (27.01.2014 в 10:23)   личное сообщение
 
 

да, я переделовал, но не помогло. у меня office 2003

  Ответить  
 
 автор: Вакшуль Сергей   (27.01.2014 в 12:11)   личное сообщение
 
 

:)

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList