Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / распределение данных по листам в книге / 15 сообщений из 15, страница 1 из 1
21.02.2012, 12:33
    #37672084
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
подскажите как нужно указать счетчик, что бы приразбивке по счетам на другие листы все записи были по порядку без пустых строк. На данный момент макро сразбивает по листам но не порядку строки.
рассмотрю и другие предложенные варианты )))
...
Рейтинг: 0 / 0
21.02.2012, 12:47
    #37672109
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
> Автор: VikVikVik
> подскажите как нужно указать счетчик, что бы приразбивке по счетам на другие листы все записи были по порядку без
> пустых строк. На данный момент макро сразбивает по листам но не порядку строки.

Ничего не понятно
Если макрос разбивает по разным листам а счётчик используется один для всех, то это нормально, такое поведение.
Заведи счетчики для каждого из листов и будет тебе счастье.

Или я не правильно понял???

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 12:48
    #37672114
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос,


Заведи счетчики для каждого из листов и будет тебе счастье.


вот-вот отсюда подробнее...
...
Рейтинг: 0 / 0
21.02.2012, 12:57
    #37672131
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос,

как сдесь подправить?

For i = 1 To 100
For j = 1 To 20
Worksheets("1").Cells(1 + i, j) = Worksheets("распределено").Cells(1 + i, j)
Next i
Next j
...
Рейтинг: 0 / 0
21.02.2012, 13:01
    #37672139
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос,

если пишу так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
For i = 1 To 100

For j = 1 To 20


For k = 1 To 100
     Worksheets("1").Cells(1 + i, j) = Worksheets("распределено").Cells(1 + k, j)
     
Next k


        Next j

       Next i


то получаються пустые строки (((
...
Рейтинг: 0 / 0
21.02.2012, 13:03
    #37672148
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
> Автор: VikVikVik
> вот-вот отсюда подробнее...

а что подробнее?? Я не вижу кода, который у тебя разбрасывает по разным листам. У себя я завел-бы класс:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Option 
Explicit

Dim sh As Worksheet
Dim nCurrentRow As Long

Public Function Out(sOut As String)
If Not sh Is Nothing Then
    sh.Cells(nCurrentRow, 1).Value = sOut
    nCurrentRow = nCurrentRow + 1
End If
End Function


Public Property Set SetWorkSheet(ByVal vNewValue As Worksheet)
Set sh = vNewValue
nCurrentRow = sh.Cells.SpecialCells(xlLastCell).Row
End Property


При старте макроса, сделал-бы коллекцию, в которую напихал-бы нужное количество экземпляров этого класса, примерно так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim mCol As New Collection, c As Class1
Set c = New Class1
Set c.SetWorkSheet = Sheets("Валютные")
mCol.Add c, "Валютные"
Set c = New Class1
Set c.SetWorkSheet = Sheets("Резервные")
mCol.Add c, "Резервные"
Set c = New Class1
Set c.SetWorkSheet = Sheets("Новые")
mCol.Add c, "Новые"

и при обработке получал-бы нужный екземпляр из коллекции по имени листа и выводил нужные
данные, например так
Код: vbnet
1.
2.
3.
 Set c = mCol("Резервные")
c.Out ("322223123456")
Set c = Nothing



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 13:05
    #37672156
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
> Автор: VikVikVik
> то получаються пустые строки (((

Странно, там не должно быть пустых строк

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 13:11
    #37672171
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос,

сильно сложно для моего мозга )))
я сделала так что бы разбрасывало. файл прилагаю. помогите убрать пустые строки
...
Рейтинг: 0 / 0
21.02.2012, 13:56
    #37672328
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос,

может все таки подскажите(((
...
Рейтинг: 0 / 0
21.02.2012, 14:13
    #37672384
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
VikVikVikИгорь Горбонос,

может все таки подскажите((( вообще-то у маня то-же есть работа
...
Рейтинг: 0 / 0
21.02.2012, 16:49
    #37672874
VikVikVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Игорь Горбонос
спасибо, но все как в тумане)))
...
Рейтинг: 0 / 0
21.02.2012, 18:18
    #37673149
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
> Автор: VikVikVik
> спасибо, но все как в тумане)))

Еще раз, у тебя "удачная" структура, имена листов - две последние цифры счета + сами счета последовательные и монотонно
возрастающие. Поэтому можно опустить проверку полного счета и ограничится двумя последними цифрами. Как только появится
счет выбивающийся из этой последовательности, логику проверок нужно будет менять.
Теперь сам код. Т.к. номера счетов у тебя идут непрерывно то можно сделать простой цикл по изменяющейся части счетов и
заполнить листы шапками будущих таблиц. А так-же инициализировать структуру, с помощью которой будем определять на какой
лист выводить и куда выводить.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
For i = 1 To 27
' Идем по всем листам, проставляем там шапки и подготавливаем для работы
' Листы имеют имена 1, 2, 3, 4 и т.д поэтому делаем простой цикл от 1 до 27 по количеству листов
' Получаем лист в переменную и копируем туда шапку, не по ячеечно, а сразу всем диапазоном
    Set sh = Sheets(CStr(i))
    sh.Range(sh.Cells(1, 1), sh.Cells(1, 8)).Value = _
        Sheets("распределено").Range(Sheets("распределено").Cells(1, 1), Sheets("распределено").Cells(1, 8)).Value
' После чего инициируем экземпляр класса, в котором будет хранится информация о листе, на который будет выводится 
информация
    Set c = New Class1
' Сохраняем в объекте ссылку на обслуживаемый лист, счетчик текущей позиции на листе хранится в самом объекте
' и делается равным 2 при получении ссылки на лист. А в функции вывода Out увеличивает своё значение на 1, т.е. сдвигает 
позицию следующего вывода вниз, на новую строку
    Set c.SetWorkSheet = sh
' Добавляем подготовленный объект в коллекцию с ключем, равным имени листа и равным последним двум цифрам счета(первые 
девять цифр без лидирующего нуля опускаем :) )
    mColl.Add c, CStr(i)
Next i
Set c = Nothing


С первой частью, так сказать подготовкой - закончили. Теперь собственно рабочий цикл
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
' Заполнили, теперь идем по 
данным
For i = 1 To 100
' Т.к. нас из всего счета интересуют только две последние цифры - получаем только их
' По ним получим объект, который выведет на нужный лист нужные данные
' Получаем две последние цифры счета, по которым получаем объект класса с нужным листом
    a = Right(Worksheets("распределено").Cells(1 + i, 2).Text, 2)
    ' И передаем в функцию вывода, Range, который нужно вывести.
    ' Только я сделал на 8 столбцов, по количеству столбцов в шапке, а не на 27 - как в цикле
    ' Здесь можно поставить условие окончания цикла, что-бы не гонять впустую но конца счетчика
    If Len(a) > 0 Then
' Здесь мы сначала получаем объект
        Set c = mColl.Item(CStr(Int(a)))
' а потом вызываем его метод и передаем диапазон для вывода
' и в этой функции происходит вывод диапазона, а так-же "сдвиг" текущей позиции для вывода на одну строку вниз.
' Причем этот сдвиг происходит только в этом объекте, для этого листа,
' во всех остальных объектах свои счетчики и они передвигаются независимо от счетчиков других листов
        c.Out Sheets("распределено").Range(Sheets("распределено").Cells(1 + i, 1), Sheets("распределено").Cells(1 + i, 
8))
    End If
Next i


А потом простой цикл очистки коллекции.

По самим коллекциям почитай здесь и
здесь и вообще проштудируй на www.firststeps.ru разделы по Visual
Basic и VBA by Step.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 22:11
    #37673477
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Макрос6 вполне можно заменить на:
Код: vbnet
1.
2.
3.
4.
5.
6.
Sub Очистить()
Dim J
For J = 1 To 27
    Sheets(J).Cells.ClearContents
Next J
End Sub


Короче будет. Основную процедуру тоже можно значительно урезать
...
Рейтинг: 0 / 0
21.02.2012, 22:20
    #37673491
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
сории строка должна быть такой:
Код: vbnet
1.
  Sheets(Trim(Str(J))).Cells.ClearContents
...
Рейтинг: 0 / 0
21.02.2012, 22:59
    #37673541
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распределение данных по листам в книге
Ну а всё вместе где-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 Sub РАСКИДАТЬ()
 Dim M()
 Dim LR
 Dim R, C
 Очистить
 Dim L
 LR = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row
 M = Sheet3.Range(Sheet3.Cells(1, 1), Sheet3.Cells(LR, 8)).Value
For R = 1 To 27
  For C = 1 To 8
      Sheets(Trim(Str(R))).Cells(1, C) = M(1, C)
Next C, R
For R = 2 To UBound(M)
 L = VBA.Right(M(R, 2), 2)
 LR = Sheets(Trim(Str(L))).Cells(Rows.Count, 1).End(xlUp).Row + 1
  For C = 1 To 8
      Sheets(Trim(Str(L))).Cells(LR, C) = IIf((C = 2 Or C = 4), Format(M(R, C), "##############"), M(R, C))
Next C, R
 End Sub
 
Sub Очистить()
Dim J
For J = 1 To 27
    Sheets(Trim(Str(J))).Cells.ClearContents
Next J
End Sub
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / распределение данных по листам в книге / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]