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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2014, 00:45   #1
Kefirrr
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 53
По умолчанию Заполнение почтового бланка

Не так давно мне очень сильно помогли на этом форуме, поэтому считаю своим долго выложить свои наработки по части автоматического заполнения почтового бланка. Файл еще требует ОГРОМНОЙ доработки, но зато теперь формирует индекс. Надеюсь это кому-нибудь понадобиться.
Так же надеюсь на помощь форумчан по части:
1)как уменьшить макрос (т.к. каждая цифра индекса у меня формируется отдельно, и поэтому файл начинает подтормаживать)
2) как сделать так, чтобы сумма писалась прописью (в данном файле я просто на бланке написала)
3)у меня адрес написан в одну строчку, как сделать так, чтобы переносил слова на другую строчку
4) как изменить ФИО получателя в Р.падеж

P.S. рано или поздно я найду решение, но если кто-нибудь поможет ускорить этот процесс буду премного благодарна.
Вложения
Тип файла: zip 7а.zip (89.4 Кб, 15 просмотров)
Kefirrr вне форума Ответить с цитированием
Старый 10.05.2014, 01:39   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

попробую ответить на вопросы:

1) на отдельном (возможно, скрытом) листе рисуете все цифры индекса от 0 до 9
и назначаете диапазонам ячеек имена типа digit0, digit1 и т.д.
Потом в цикле проходите по значению индекса, и копируете нужные цифры со скрытого листа
Как-то так будет выглядеть:

Код:
index$ = Cells(ActiveCell.Row, 3)
for i& = 1 to 6
   digit$ = mid(index$,i,1) ' берем очередную цифру индекса
   ' копируем её (со скрытого листа) на позицию очередной цифры (со смещением относительно позиции первой цифры)
   worksheets("имя_скрытого_листа").range("digit" & digit$).copy Sheets("Форма_7-а").Cells(31, 9).offset(0, (i-1)*2)
next

2) сумма прописью? достаточно эту фразу вставить в яндекс, - как тут же найдете кучу примеров этой функции на VBA

3) лучше под адрес сделать одну объединённую ячейку, я включить в этой ячейке перенос по словам

4) вы поиском вообще не пользуетесь?
первый результат выдачи по запросу «VBA родительный падеж»
http://excelvba.ru/code/GenitiveCase


И ещё: добавление в самом начале макроса строки
Код:
Application.ScreenUpdating = False
а в конце - строки
Код:
Application.ScreenUpdating = True
заметно ускорит заполнение бланка

Последний раз редактировалось EducatedFool; 10.05.2014 в 03:58.
EducatedFool вне форума Ответить с цитированием
Старый 10.05.2014, 02:40   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

1) Теперь я понимаю, как люди умудряются получать ошибку компилятора "Procedure too large"
Вот так может выглядеть процедура рисования одной цифры. В процедуру передается диапазон - верхняя ячейка цифры, и число-цифра (0-9).
Ниже - тестовая процедура. Нажимайте F5 для продолжения.
Код:
Option Explicit

Const D = "110101110 010011000 111000110 101010001 011101000 " & _
  "101101100 001011110 100010010 111101110 111100001"

Sub DrawDigit(c As Range, i As Long)
Dim s$, n, j&
s = Split(D)(i)
With c.MergeArea
  For Each n In Array(xlEdgeTop, xlEdgeRight, xlEdgeBottom, xlEdgeLeft, xlDiagonalUp)
    j = j + 1
    .Borders(n).Weight = IIf(Mid$(s, j, 1) = "0", xlHairline, xlThick)
  Next
End With
With c.Offset(1).MergeArea
  For Each n In Array(xlEdgeRight, xlEdgeBottom, xlEdgeLeft, xlDiagonalUp)
    j = j + 1
    .Borders(n).Weight = IIf(Mid$(s, j, 1) = "0", xlHairline, xlThick)
  Next
End With
End Sub

Sub test()
Dim i&
Sheets.Add
Columns("B:E").ColumnWidth = 0.75
Rows(2).RowHeight = 25
Range("3:4").RowHeight = 12.5
Range("B2:E2").Merge
Range("B3:E4").Merge

For i = 0 To 9
  DrawDigit [b2], i
  Stop
Next
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 10.05.2014, 19:01   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Еще короче, но менее прозрачно
Код:
Const D = "854 529 476 173 666 910 969 69 990 190"

Sub DrawDigit(c As Range, i As Long)
Dim ptrn&, n&, bit&, topBot&
ptrn = Split(D)(i)
bit = 1
For topBot = 0 To 1
  With c.Offset(topBot).MergeArea
    For n = 6 To 10
      .Borders(n).Weight = IIf(ptrn And bit, xlThick, xlHairline)
      bit = bit + bit
    Next
  End With
Next
End Sub

Sub test()
Dim i&
Sheets.Add
Columns("B:E").ColumnWidth = 0.75
Rows(2).RowHeight = 25
Range("3:4").RowHeight = 12.5
Range("B2:E2").Merge
Range("B3:E4").Merge

For i = 0 To 9
  DrawDigit [b2], i
  Stop
Next
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 10.05.2014, 21:36   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

аналогичное по подходу и степени непонятности решение:
Код:
Sub test()
  Dim i As Long
  For i = 0 To 9
    Indx Cells(10, i * 2 + 2), i
  Next
End Sub

Sub Indx(rg As Range, d As Long)
  Const d0 As String = "5658 4368 5129 1285 4628 1564 2334 1282 7710 5637"
  Dim i As Long
  For i = 0 To 9
    If Int(Val(Split(d0)(d)) / 256 ^ (1 - Int(i / 5))) And 2 ^ (i Mod 5) _
      Then rg.Offset(Int(i / 5), 0).Borders(i Mod 5 + 6).Weight = xlMedium
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 10.05.2014 в 21:57.
IgorGO вне форума Ответить с цитированием
Старый 10.05.2014, 23:10   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

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

Это ж надо так код писать, что, пока его не запустишь, — ни за что не догадаешься, что он делает))
С таким подходом к программированию, никаких обфускаторов кода не понадобится...
EducatedFool вне форума Ответить с цитированием
Старый 11.05.2014, 02:29   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

если догадаться как описаны верхняя и нижняя часть цифры - то все довольно просто)))
вот так чуть проще:
Код:
Sub Indx2(rg As Range, d As Long)
  Const d0 As String = "346:356 26:6 46:25 24:24 356:6 345:56 25:356 24:3 3456:356 3456:2"
  Dim i As Long, n As Long:  n = 0
  For i = 1 To Len(Split(d0)(d))
    If Mid(Split(d0)(d), i, 1) = ":" Then n = 1 Else rg.Offset(n, 0).Borders(Val(Mid(Split(d0)(d), i, 1)) + 4).Weight = xlMedium
  Next
End Sub
в строке d0 описаны цифры от 0 до 9
до двоеточия : описана верхняя часть изображения цифры, после - нижняя
1 - диагональ слева-сверху вправо-вниз (в изображениях цифр не используется, но пусть будет для универсальности)
2 - дмагональ слева-снизу вправо-вверх
3 - левая
4 - верхняя
5 - нижняя
6 - правая сторона
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 11.05.2014, 02:32   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а если это почитать - должно отпустить от прочитанного ранее
Код:
Sub Indx3(rg As Range, d As Long)
  Const d0 As String = "лвп:лнп +п:п вп:+н +в:+в лп:вп лвн:нп +:лпвн +в:л лвп:лвнп лвнп:+"
  Dim i As Long, n As Long, c As String:  n = 0
  For i = 1 To Len(Split(d0)(d))
    c = Mid(Split(d0)(d), i, 1)
    If c = ":" Then n = 1 Else rg.Offset(n, 0).Borders(BrdNum(c)).Weight = xlMedium
  Next
End Sub


Function BrdNum(s As String) As Long
  Select Case s
  Case "-"
    BrdNum = 5
  Case "+"
    BrdNum = 6
  Case "л"
    BrdNum = 7
  Case "в"
    BrdNum = 8
  Case "н"
    BrdNum = 9
  Case "п"
    BrdNum = 10
  End Select
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание бланка заказов seliger Фриланс 2 06.02.2013 23:44
Создание бланка заявки на основе прайса id48 Microsoft Office Excel 8 19.02.2012 00:24
UserForm для очистки разделов бланка BDA2011 Microsoft Office Excel 12 15.11.2011 09:36
Создание бланка на форме по заданным параметрам Nasten'ka7 Microsoft Office Excel 0 27.01.2011 16:13
Ввод бланка в базу данных access Norick БД в Delphi 6 24.02.2010 16:55