Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 15:38   #1
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию Вывод данных на другой лист в рабочей книге

Суть программы в том, что есть лист (Лист4), в
этом листе 3 столбца, 1-й код клиента, 2-й стомость покупки, 3-й сумму которую клиент заплатил. Необходимо на другой лист (Лист5) перенести код клентов, у которых задолженность более 1000 руб (2 столбец -3 столбец).
Вот код программы, которую я написал, у меня программа переносит клиентов у которых задолженность более 1000 руб., однако есть пробелы между клиентами, которых быть не должно, а также если задолженность равна 0, то код клиента все равно отражается, почему не понятно.
Public Sub Пример12()
Dim Kodklienta As Integer, i As Integer, j As Integer
With Worksheets("Лист4").Range("A3")
Kodklienta = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
Dolg = 0
For i = 1 To Kodklienta
Dolg = .Offset(i, 1) - .Offset(i, 2)
For j = 1 To Kodklienta
kod = .Offset(i, 0)
Next j
With Worksheets("Лист5").Range("A3")
Ostatok = Range(.Offset(0, 1), .End(xlToRight)).Columns.Count
If Dolg > 1000 Then .Offset(i, Ostatok) = Dolg
If .Offset(i, Ostatok) = Dolg Then .Offset(i, 0) = kod
End With
Next i
End With
End Sub

Последний раз редактировалось Palomnik1096; 14.12.2010 в 15:43.
Palomnik1096 вне форума Ответить с цитированием
Старый 14.12.2010, 16:30   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот это точно лишний цикл
Код:
For j = 1 To Kodklienta
kod = .Offset(i, 0)
Next j
И наверное ошибка в With на With - к чему там в конце относится .Offset и .End(xlToRight)?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 14.12.2010 в 16:33.
Hugo121 вне форума Ответить с цитированием
Старый 14.12.2010, 20:15   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Palomnik1096 Посмотреть сообщение
Суть программы в том, что есть лист (Лист4), в
этом листе 3 столбца, 1-й код клиента, 2-й стомость покупки, 3-й сумму которую клиент заплатил. Необходимо на другой лист (Лист5) перенести код клентов, у которых задолженность более 1000 руб (2 столбец -3 столбец).
А если так?
Вложения
Тип файла: rar Книга1.rar (8.6 Кб, 30 просмотров)
С уважением, Алексей.

Последний раз редактировалось tae1980; 14.12.2010 в 20:25.
tae1980 вне форума Ответить с цитированием
Старый 15.12.2010, 02:32   #4
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

спасибо, так намного понятнее и видимо правильнее!!!
Palomnik1096 вне форума Ответить с цитированием
Старый 16.12.2010, 09:28   #5
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Сделал сам с помощью цикла For ... Next

Public Sub Пример12()
Dim Kodklienta As Integer, Stoimost As Integer, Vyplata As Integer
With Worksheets("Лист4").Range("A3")
kod = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
qwe = 0
For i = 1 To kod
Stoimost = .Offset(i, 1)
Vyplata = .Offset(i, 2)
Dolg = Stoimost - Vyplata
kodkl = .Offset(i, 0)
If Dolg > 1000 Then
qwe = qwe + 1
Worksheets("Лист5").Range("B3").Off set(qwe, 0) = Dolg
Worksheets("Лист5").Range("A3").Off set(qwe, 0) = kodkl
End If
Next i
End With
End Sub
Palomnik1096 вне форума Ответить с цитированием
Старый 16.12.2010, 23:42   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Palomnik1096 Посмотреть сообщение
Сделал сам с помощью цикла For ... Next

Public Sub Пример12()
Dim Kodklienta As Integer, Stoimost As Integer, Vyplata As Integer
With Worksheets("Лист4").Range("A3")
kod = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
qwe = 0
For i = 1 To kod
Stoimost = .Offset(i, 1)
Vyplata = .Offset(i, 2)
Dolg = Stoimost - Vyplata
kodkl = .Offset(i, 0)
If Dolg > 1000 Then
qwe = qwe + 1
Worksheets("Лист5").Range("B3").Off set(qwe, 0) = Dolg
Worksheets("Лист5").Range("A3").Off set(qwe, 0) = kodkl
End If
Next i
End With
End Sub
Позволю себе небольшой ликбез. Все что я скажу - мое ИМХО.

Система координат (СК).
Существуют два типа СК: абсолютные и относительные.
Относительные СК - это те которые ведет отсчет от каких либо ближайших ориентиров, а изменения координат записываются любим способ описывающим смещением объектов от ориентиров, или раннее описанных объектов. Они удобны для локальных пространств, и как правило применяются для сильно ограниченных объектов (содержащих ограниченное число точек (объектов)). Их преимущество в гибкости, объекты записанные (описанные) в подобных СК без особых проблем и потери точности можно привязать к любым абсолютным СК и связать между собой (если при описании объектов соблюдались ряд правил). Минус в том, что любое изменение влияет на ВЕСЬ объект (зачастую фатально) и как следствие нужно пересчитывать ВСЕ с нулю. Если объект большой (или это огромная цепочка объектов) то подобный пересчет весьма затруднителен, даже с использованием ЭВМ. А так же велика вероятность ошибки, так их очень ТРУДНО отслеживать.
Абсолютные СК - имеет одну единую точку взятую за ноль, а координаты объектов записываются в некой мере смещений от нулевой точки. Это глобальные системы, любая крупная сеть объектов должна иметь абсолютную СК. Минус систем в том, что перевод из одной СК в другую, может быть весьма проблематичен, и иметь в сложных случаях коэффициент не точности. Плюс же в том, что можно создавать единый СК. Что позволяет без каких либо дополнительных расчетов объединять неограниченное количество совершенно разных объектов и информации. Обработка данных становиться более легкой и наглядной, а алгоритмы упрощаются. Появляется понятие - стандарт.

Ты упорно используешь относительную СК ".Offset(i, 1)". Тогда как я стараюсь всегда стараюсь работать в абсолютной СК "cells(1,1)". В первую очередь из-за наглядности кода, поиск ошибок значительно упрощается, система ведет себя предсказуемо, тогда как при относительной СК заранее быть уверенным в результате нельзя - появляются факторы которые ты не контролируешь.
Range("B3") - относится к абсолютной СК, но следует избегать использования такой адресации, так как подобные вид кода труднее воспринимается человеком, и сложнее поддает модернизации.

Прекрати использовать обращение вида "Worksheets("Лист5")". Обращайся к листу в текущей книге по кодовому имени, это даст независимость от пользователя, будет занимать меньше места, что благоприятно скажется на читаемости когда (строки бывают ох какие длинные и мудреные). Упростить модернизацию кода в будущем, да и это проще для восприятия, что так же не мало важно.

Константы вместо цифр.
ВЕЗДЕ где можно следует заменять цифры константами, и описывать их в начале когда. Это сделает код гибче, и позволит вносить изменения без серьезных исправлений самого кода. А так же повысится его читаемость. Например, что ты будешь делать если потребуется выявить клиентов с задолженностью в 2000 или 900 рублей? :))

Имена переменных.
Переменным лучше давать сложные составные имена. Так как простые имена не отображаются всех особенностей содержащейся в переменной информации. Например: "Stoimost" Это стоимость чего? Или "Dolg" - это чей долг (фирмы, партнера, банка или долг по зарплате)?
Переменные следует разбивать на группы, объединяя их по главному общему признаку, при это общий признак должен находиться в начале названия переменной. Например: КлиентСтоимость, КлиентДолг, КлиентТоварКолво, ФирмаДолг, СкладТоварКолво СкладТоварСтоимость и т.п.
Соблюдение этого правили будет особенно полезно, если ты собираешься развивать программу и код. В отдельных случаях удобно отображать в имени переменной ее тип, ставя первым знаком английскую букву - первую букву типа переменной (s, b, d, i и т.п.)

Все описанное я отразил в приведенном выше примере.
С уважением, Алексей.

Последний раз редактировалось tae1980; 16.12.2010 в 23:55.
tae1980 вне форума Ответить с цитированием
Старый 17.12.2010, 07:02   #7
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

Огромное спасибо за разъяснения, теперь стало намного понятнее, в чем отличие Аб.ссылок от От. ссылок. Дело в том, что я программированием в VBA занимаюсь всего 4 месяца (программированием вообще никаким ранее не занимался). Учусь по книге Кристиана Олбрайта,видимо просто стиль программирования указанный в книге сильно влияет на меня (он в основном работает через offset), поэтому это отражается в написании программ. Есть еще одна книга по которой учусь автор Мак-Федрис, вот у него стиль более похож на твой, у него в основном используется Cells. Но поскольку начал обучение с первой книги, то пока видимо придется работать с offset, одновременно учась использовать cells.
Общая разница в наших программах я так понял в том, что мою можно применить только к конкретным листам книги, твою можно использоать в любой открытой книге и листе.
Поскольку изучаю все сам, а подсказать, как всегда некому, то приходится мучиться, чтобы родить что-то хорошее похожее на программу. Я только меся назад понял чем метод от свойства отличается, поэтому не все так хорошо.
Еще раз огромное спасибо!!!
PS в твоем коде к сожалению так и не разобрался((
Palomnik1096 вне форума Ответить с цитированием
Старый 17.12.2010, 07:38   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Данную задачу можно решить существенно проще, без использования каких либо циклов и переменных. Например, так:
Код:
Sub Выборка()
    Application.ScreenUpdating = False
    Sheets(2).Cells.ClearContents: [D2].Formula = "=B2-C2"
    [D2].AutoFill Destination:=Range("D2:D" & [A65536].End(xlUp).Row)
    [A:D].AutoFilter Field:=4, Criteria1:=">=1000"
    Union([A:A], [D:D]).SpecialCells(xlCellTypeVisible).Copy Sheets(2).[A1]
    Sheets(2).[B1] = "Долг": [A:D].AutoFilter: [D:D].ClearContents
End Sub
Пример во вложении.
Вложения
Тип файла: rar Книга1.rar (7.1 Кб, 20 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 17.12.2010, 14:58   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Данную задачу можно решить существенно проще, без использования каких либо циклов и переменных. Например, так:
Интересный способ. Но через циклы мне как-то привычнее, так сказать ближе к телу. :))
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 18.12.2010, 04:42   #10
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

дело в том, что по условиям задания требуется использовать цикл, а также чтобы не было формул, в выводимых ячейках!
однако за другой вариант все рвно спасибо!
Palomnik1096 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенос данных на другой лист Jonny B Microsoft Office Excel 15 26.04.2011 09:16
Выбор и перенос данных в другой лист sergey77 Microsoft Office Excel 6 17.08.2010 17:10
Поиск и вывод результата на другой лист!!! Ilnour1986 Microsoft Office Excel 12 23.10.2009 11:38
по ткущему дню найти столбец, по месяцу - лист в другой книге trochn Microsoft Office Excel 5 30.09.2009 19:28
Переброс данных на другой лист в таблицу vodvorezlaya Microsoft Office Excel 1 06.06.2007 14:07