Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: MaximuS G
Дата сообщения: 29.08.2008 14:27
nick7inc

Цитата:
Сделайте проще, заведите себе специальную вкладку Excel, где в столбцы A и B вбейте все параметры: в A - первый, в B - второй и считывайте их от туда:


Супер, спасибо...
Скажите еще, если у меня данные начинаються с 7 ряда, то мне приходиться ставить i=7, я думаю есть какая-то возможность написать, что данные считывались с 7го ряда, а i=1, может как-то index+6

А по поводу этого ничего не подскажите:
[more]
Подскажите пожалуйста как разорвать связи в Excel, сразу все, если такое возможно.


Код:ActiveWorkbook.BreakLink Name:= "..." , Type:=xlExcelLinks

такое не очень подходит - макрос универсальный, я могу не знать пути ссылки


Код:Private Sub Workbook_Open()

ThisWorkbook.UpdateLinks = xlUpdateLinksNever
ThisWorkbook.UpdateRemoteReferences = False

End Sub


Такое тоже чето не работает...



Добавлено:
Хотя если в ручную меняю в Properties, тогда работает - но вручную это же не дело ..
[/more]
Автор: nopoxz
Дата сообщения: 29.08.2008 15:19
nick7inc

А можно примерчик или где-то в нете почитать про "в отдельную процедуру вынести, передавая ей только координаты вставки в качестве параметров."
Автор: nick7inc
Дата сообщения: 29.08.2008 21:53
MaximuS G

Цитата:
есть какая-то возможность написать, что данные считывались с 7го ряда, а i=1, может как-то index+6

Если во всех случаях у вас данные начинаются с 7го ряда и заканчиваются 1000, то можно написать:
Код: For i=7 to 1000
Автор: SAS888
Дата сообщения: 01.09.2008 07:34
MaximuS G

Цитата:
А по поводу этого ничего не подскажите:

Попробуй так:

Код: Sub BrLink()

Dim i As Long, x As Variant
x = ActiveWorkbook.LinkSources
If Not IsEmpty(x) Then
For i = 1 To UBound(x)
ActiveWorkbook.BreakLink Name:=x(i), Type:=xlExcelLinks
Next i
End If

End Sub
Автор: MaximuS G
Дата сообщения: 01.09.2008 08:30
SAS888
Спасибо, работает

Добавлено:
Помогите, плз... не могу чето понять.
Есть список:

arg1 = " на 36"
arg2 = "вариант1 "
arg3 = "вариант2 "
arg4 = "вариант3 "

Пытаюсь в цикле получить агрумент функции SaveAs, следующим способом:

ActiveWorkbook.SaveAs ((arg + Cstr(index) + arg1)
Хотелось бы получить arg2 = (arg+Cstr(index)), если index =2 и т.д... чето не получается
Тоесть должно получиться "вариант1 на 36", "вариант2 на 36" и т.д.

Спасибо
Автор: SAS888
Дата сообщения: 01.09.2008 13:18
MaximuS G
А нельзя Ваши аргументы (arg1, arg2 и т.д.) организовать в виде массива? Тогда с организацией цикла проблем не будет.
Автор: MaximuS G
Дата сообщения: 01.09.2008 13:51
SAS888

Да, наверное, можно )) Только я не знаю как ...
Буду разбираться ...

Добавлено:
Если есть возможность, что-нибудь подскажите
Автор: Klaid1
Дата сообщения: 01.09.2008 23:30
Подскажите как написать на VBA следующую процедуру:

Есть таблица, в нее добавляется автофильтр в нем выбирается определенное значение и переход на следующий лист. Далее то же самое - вставка автофильтра, выбор, переход на следующий лист.
Листы должны быть без указания конкретного имени.

Если первую часть можно сделать руками, то как должен выглядеть макрос перехода на следующий лист???

Автор: SAS888
Дата сообщения: 02.09.2008 05:10
Klaid1
Переход на следующий лист можно осуществить так:

Код: Sheets(ActiveSheet.Index + 1).Select
Автор: ksodi
Дата сообщения: 02.09.2008 13:43
WowGun, спасибо! то что надо.

Автор: MaximuS G
Дата сообщения: 02.09.2008 14:25
SAS888

ReDim a(UBound(arg)) 'Определяем размерность массива результатов

Можете объяснить, почему без этой команды никак, не могу въехать

P.S. Вообщем значения вытягивать из массива получаеться )
Автор: jocer
Дата сообщения: 02.09.2008 15:01
Workbooks("тратата.xls").Close savechanges = False перед закрытием показывает сообщение: в буфере обмена содержится большой формат данных... как избавиться от появления этого сообщения?
Application.DisplayAlerts = False: Workbooks("тратата.xls").Close - эксель сразу виснет
Автор: MaximuS G
Дата сообщения: 02.09.2008 15:04
Как можна учить работу с объектами Excel ?
Макрорекодер как-то записывает ?
Автор: mistx
Дата сообщения: 02.09.2008 16:19
Друзья подскажите пожалуйста как решить данную задачу?

может как то это можно реализовать в екселе?

Есть таблица в ворде - 8 колонок.

1- 12\07\1999
2- 28\07\1999
3 - 15
4- 16
5- 120000
6 - хххх.хх
7- хххх.хх

строк с подобными параметрами около 20

нужно чтобы получилось без таблицы в одну строку

с 12.07.1999 по 28.07.1999 - 120000 Х 16% Х 15 дн Х хххх.хх

КАк реализовать?

Заранее благодарю
Автор: Oyger
Дата сообщения: 02.09.2008 17:04

Цитата:
Друзья подскажите пожалуйста как решить данную задачу?
может как то это можно реализовать в екселе?
Есть таблица в ворде - 8 колонок.
1- 12\07\1999
2- 28\07\1999
3 - 15
4- 16
5- 120000
6 - хххх.хх
7- хххх.хх

Можно ручками. И даже в Ворде.
Эти столбцы меняешь местами: как у тебя должны быть данные по тексту - просто перетаскиваешь мышкой.
Далее - создаешь вспомогательные столбцы. О чем говорю? Смотри

Цитата:
с 12.07.1999 по 28.07.1999 - 120000 Х 16% Х 15 дн Х хххх.хх

Первый столбец будет вспомогательный - вставляешь его. В первом столбце во всех ячейках пишешь "с" (делается в два счета).
Далее идет твой столбец с датой (пробел пропускаем).
3-ий столбец делаем тоже вспомогательным - везде "по" (тоже элементарно)
4-ый - дата.
5-ый - "-"
и т.д.
Когда все подготовил - выделяешь таблицу целиком и счелкаешь: Таблица (пункт меню) - Преобразовать - Таблицу в текст ...
Выбираем разделитель "другой" и ставим пробел.
Готово - получаем вместо таблицы текст...

Можно, конечно, и код забабахать...
Автор: twindim77
Дата сообщения: 03.09.2008 03:50
Может кто нибуть сталкивался и знает решение...
в Forms расположены ListBox в которые вбиваются даты
1. Формат дат к сожалению как ни крути ММ.ДД.ГГ (хотя в региональных настройках привычные нам ДД.ММ.ГГ)
2. Худшее то, что стал excel виснуть при изменении дат.
Обе проблеммы лечатся и работает все идеально...2 мя способами и ОБА способа неприемлемы.
1. Зайти в Региональные настройки и НИЧЕГО не меняя подтвердить формат даты.
2. Установить excel-97 (любой его кусок)...и тут же снести его.
В этом случае и формат даты правильный и всё летает без зависонов, но не скажешь же всем включая иногородных, мол лечение есть)))))...
Помогите если кто знает, уже много времени убил...
Автор: Oyger
Дата сообщения: 03.09.2008 16:25
twindim77
Текст инициализации формы и заполнения ListBox датами можешь вставить.
И конкретнее: как заполняется ListBox? При помощи чего? и т.п.
А то искать ошибку типа "ребята, при работе макроса виснет комп - в чем проблема?" как-то трудно...
Автор: Solenaja
Дата сообщения: 03.09.2008 18:00
есть вот такой макрос
Sub Un-protect()
'
' Снимает защиту со всех листов книги.
' Макрос записан 23.05.2008 (Горшков М.В.)
'

Dim PWORD As String
' присвоить PWORD пароль от листа
PWORD = "11111"

For Each WkSht In Worksheets
WkSht.Unprotect Password:=PWORD
Next WkSht
End Sub

Sub P-rotect()
'
' Защищает паролем все листы книги.
' Макрос записан 23.05.2008 (Горшков М.В.)
'

Dim PWORD As String
' присвоить PWORD пароль от листа
PWORD = "11111"

For Each WkSht In Worksheets
WkSht.Protect Password:=PWORD
Next WkSht

End Sub

но по-умолчанию для страниц разрешено выделение заблокированных и незаблокированных ячеек, как назначить / снять пароль для всех листов чтобы запретить эти два разрешения?
Автор: Klaid1
Дата сообщения: 04.09.2008 00:37
MaximuS G

Цитата:
Klaid1
Переход на следующий лист можно осуществить так:

Код:Sheets(ActiveSheet.Index + 1).Select

Только следите за тем, чтобы не получилось перехода на несуществующий лист, т.е. следующий за последним.
Чтобы получить код VBA для создания автофильтра, запустите макрорекордер, проделайте то, что Вам нужно и подправьте полученный код.


Отлично, работает. Правда она теперь просто переходит на другой лист и стоит.

Надо вот как сделать:
выборка, переход на другой лист, выборка... последний лист выборка, стоп.

Выборку сделаю просьба подсказать остальное.
Автор: SAS888
Дата сообщения: 04.09.2008 05:05
MaximuS G

Цитата:
ReDim a(UBound(arg)) 'Определяем размерность массива результатов
Можете объяснить, почему без этой команды никак, не могу въехать

При определении переменных, размерность массива результатов неизвестна. Поэтому мы определяем динамический массив Dim a(). После того, как сформирован массив исходных данных (массив "arg"), то командой ReDim a(UBound(arg)) мы определяем размерность массива "a" равную размерности массива "arg".

jocer

Цитата:
как избавиться от появления этого сообщения?

Можно перед закрытием книги средствами VBA очистить буфер обмена (если, конечно, это допустимо).

twindim77

Цитата:
в Forms расположены ListBox в которые вбиваются даты

Для таких целей рациональнее использовать не ListBox, а DTPicker.

Solenaja

Цитата:
но по-умолчанию для страниц разрешено выделение заблокированных и незаблокированных ячеек, как назначить / снять пароль для всех листов чтобы запретить эти два разрешения?

Установить защиту с паролем и запретить выделение любых ячеек можно, выполнив:

Код: WkSht.Protect Password:=PWORD
WkSht.EnableSelection = xlNoSelection
Автор: MaximuS G
Дата сообщения: 04.09.2008 09:50
Подскажите, почему не работает код:
разобрался
Автор: Solenaja
Дата сообщения: 04.09.2008 09:57
SAS888
спасибо.
есть ещё вопрос.
на листе есть не защищенные ячейки, нужно установить пароль на лист чтобы эти ячейки не блокировались, т.е. разрешить выделение не защищеннных ячеек
Автор: Oyger
Дата сообщения: 04.09.2008 10:39
Solenaja

Цитата:
на листе есть не защищенные ячейки, нужно установить пароль на лист чтобы эти ячейки не блокировались, т.е. разрешить выделение не защищеннных ячеек

Если в свойстве ячейки уже снята функция защиты - просто защити лист. Ячейка будет доступной для изменения.
Если же функция защиты не снята - перед защитой листа сними ее командой Range(...).Locked = False
Если же ты хочешь, чтобы после защиты выделялись только не защищенные ячейки, а защищенные не выделялись вставь строку:
Sheets(...).EnableSelection = xlUnlockedCells
Автор: Solenaja
Дата сообщения: 04.09.2008 11:49
Oyger

Цитата:
Если же ты хочешь, чтобы после защиты выделялись только не защищенные ячейки, а защищенные не выделялись вставь строку:
Sheets(...).EnableSelection = xlUnlockedCells
спасибо, но выдает ошибку
Expected: identifier or bracketed expression
Автор: Oyger
Дата сообщения: 04.09.2008 12:13
Solenaja
Функция работает.
Ищи ошибку. Может где что наврал: книга не та активна или еще что...
А скорее - ошибка в написании...

Добавлено:
У меня в свою очередь тоже вопрос...
Вот я пишу код и описываю в нем переменную:
Dim XXX as ...
Что это значит - в памяти "отрезался" кусок под эту переменную длинной ... байт (в зависимости от типа переменной).
Переменная свое отработала - до конца кода еще далеко. Переменная больше не нужна. Хочу от нее избавится.
Даже если я обнулю переменную, ее место все равно остается в памяти и ничем не занимается (опять же зависит все от жизни переменной, но это опустим).
Существует ли команда, которая позволит убить этот кусок - убить это место из памяти - освободить память?
Автор: Solenaja
Дата сообщения: 04.09.2008 16:26
Oyger
на троеточее ругается ваше

Добавлено:
работает так
WkSht.EnableSelection = xlUnlockedCells
Автор: ecolesnicov
Дата сообщения: 04.09.2008 17:00
Oyger

В Excel для очистки используются следующие приемы:
1) для очистки массива - Erase
2) Для очистки объекта - Unload
3) Для очистки других переменных - x=empty (могу и ошибаться, но что-то с empty)

Если переменных слишком уж много - может выдаться ошибка "Too many local, nonstatic variables" (маловероятно - я никогда с таким не сталкивался, хотя использовал сложные объектные переменные и массивы с 10-ками тысяч строк). Сам Excel рекомендует в таком случае описывать переменные как Static, так как они выделяются "из другой памяти" ...
Автор: twindim77
Дата сообщения: 04.09.2008 19:25
Oyger
Насчет DTPicker...его просто нет по умолчанию...доустанавливать неприемлемо.
Инициализации формы как таковой нет ( я просто неумею этого). А заполнение ListBox
примитивно...Открыл форму Show встал на лист бокс...вписал дату она и прописалась в A1 (в его свойствах прописано ControlSource=xxx!A1)..хочешь прочитать архив закинул в А1 дату тоже простым способом типа A1=B1...и в лист бокс прочитал...ячейка A1 имеет формат ДД.ММ.ГГ, такой же как и в региональных настройках. Так вот если танец с бубнами не производить ( что допустимо на 1 компе...недопустимо на 60 ти других)...то Дата в лист бокс имеет формат ММ.ДД.ГГ но это полбеды...просто excel зависает при поступлении дат...они то автоматом при пересчете страницы идут в него. Но если зависло то лечение есть как писал неприемлемое, но кординально все решающее...зайти тут же в региональные настройки и ПОДТВЕРДИТЬ ничего не меняя дату и все и дата пишется как заказывали и ничего не виснет все работает...но это надо делать при каждом новом запуске...причем не ДО не после а именно во время зависона excel)))...
Автор: andrejka k
Дата сообщения: 04.09.2008 20:10
Здравствуйте. Я уже как-то обращался в данную ветку
по поводу надстройки KaotiXLdemo.xla. Тогда речь шла о том, чтобы сделать надстройку работоспособной. Благодаря уважаемому
SERGE_BLIZNUK макрос заработал, правда с ограничениями
(поскольку на сайте разработчика была выложена демонстрационная версия). Ограничения эти касаются объема обрабатываемого
массива данных - Demo version only allow you to enter 100 rows of closing prices (т.е. максимум 100 строк). Подскажите,
пожалуйста, насколько реально снять это ограничение??? Может ли кто-нибудь из здесь присутствующих помочь с данной
проблемой? Исправленная SERGE_BLIZNUK версия выложена здесь. Оригинал макроса находится
здесь.
Заранее огромное спасибо!!!
Автор: Oyger
Дата сообщения: 05.09.2008 08:54
Solenaja
А вместо троеточия имя листа вставить не пробовали?

Добавлено:
twindim77
А ты не путаешь, случаем, ListBox и TextBox?

Добавлено:
ecolesnicov

Цитата:
Сам Excel рекомендует в таком случае описывать переменные как Static, так как они выделяются "из другой памяти"

А ссылку скажешь?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.