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

» Excel VBA

Автор: Heresy
Дата сообщения: 20.05.2006 15:57
Мне нужно, чтобы в экселевском файле производились некоторые изменения и сохранялись в файл с другим именем.
Я это делаю вот так:

xl.ActiveWorkbook.SaveAs newFile
xl.Quit

Все это работает, но почему-то даже после выполнения xl.Quit в процессах Windows остается висеть EXCEL.EXE, который мне совершенно не нужен, и, более того, мешает, вызывая ошибки при последующих обращениях к Excel.
Вызывается этот экселевский файл из Access'a.
Пробовал сделать с помощью SaveCopyAs - та же история.

Помогите плиз!
Автор: satura77
Дата сообщения: 20.05.2006 17:58
Есть 2 таблицы в разных файлах на разных компах, соед. по сети. Их содержимое различно, но есть несколько одинаковых полей. Нужно сделать, чтобы при добавлении/удалении/редактировании записей в одной из таблиц, если выполняется некоторое условие по содержимому записи, то в другой таблице отражались эти изменения.
Автор: Dixi257
Дата сообщения: 20.05.2006 22:26

Цитата:
xl.ActiveWorkbook.SaveAs newFile
xl.Quit


Надо убить ВСЕ ссылки на объекты EXCEL строками вида
Set xl=Nothing
и подождать секунд 15, пока система выгрузит сервер из памяти.

Автор: DONRU1
Дата сообщения: 20.05.2006 22:42
Как можно реализовать следующую задумку:
Есть книга из N+1 листа. На 1 листе находится таблица с N столбцами.
Вопрос: Как сделать так, чтобы при выборе ячейки из таблицы на листе 1 автоматически открывался лист, соответсвующий столбцу из таблицы и курсор устанавливался на столбце, соответсвующем строке из таблицы.
Т.е. выбираем на листе 1 ячейку из столбца 2 по строке 5. Соответсвенно должны оказаться на листе 3 (2+1) в столбце 5.
Автор: Yuk
Дата сообщения: 21.05.2006 00:12
DONRU1
Типа такого (вставляется в VBA, в код листа "1"):

Код: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r As Integer, c As Integer
Dim ws As Worksheet
r = Target.Row
c = Target.Column
On Error Resume Next
Set ws = Sheets(CStr(c + 1))
If ws Is Nothing Then
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
Set ws = ActiveSheet
ws.Name = CStr(c + 1)
Else
ws.Activate
End If
ws.Cells(1, r).Select
End Sub
Автор: DONRU1
Дата сообщения: 21.05.2006 18:31
Yuk
Спасибо. Но я забыл сказать. Дело в том, что в этом файле макросов не должно быть. Все макросы в отдельной книге. Пока писал возникла Идея: Повесить макрос на комбинацию клавиш.
Автор: OchkaritO
Дата сообщения: 23.05.2006 06:41
Народ, подскажите, пожалуйста, код для календаря (Элемент управления Office 2003), чтоб при нажатии на число, соответсвующая дата появлалась в определенной ячейке. Или ссылочку, где это описывается. Спасибо.
Автор: aquaman1977
Дата сообщения: 23.05.2006 10:54
OchkaritO

Код:
Private Sub Calendar1_Click()
Cells(1, 1).Value = UserForm1.Calendar1.Value
End Sub
Автор: OchkaritO
Дата сообщения: 23.05.2006 11:28
aquaman1977


Код:
Private Sub Calendar1_Click()
Cells(5, 3).Value = Calendar1.Object
End Sub
Автор: DimidROLL
Дата сообщения: 24.05.2006 00:20
А у меня такая проблема возникла, пишу программу в Excel + VBA
Пытаюсь смоделировать транспортную задачу, модель начинает действовать 26.05.06 а заканчивает через год и далее, изменяются времена года, в зависимости от этого меняются условия функционирования, а так же растёт время в часах для дальнейшего расчёта.

В кратце: Создал в Excel 120 с лишним блоков (то есть разбил путь на участки), далее изымаю данные из Excel в VBA произвожу расчёт, вставляю в конце этого блока, далее изымаю уже новые данные и сними произвожу манипуляции, итд...

Но столкнулся с такой проблемой, что дойдя до определённой точки VBA выдаёт ошибку
Compile error: Procedure too large
Насколько я понял, слишком большую и громоздкую программу я сделал, нет ли способа обойти эту проблему, или может кто-нибудь сталкивался с подобным, как ошибкой, так может и задачей.

Заранее спасибо за ответ.
Автор: DONRU1
Дата сообщения: 24.05.2006 12:44
DimidROLL
разбей процедуру на несколько:

Private sub ляля()
.... 'твой код
call ляля2 'вызов и выполнение следующей процедуры
end sub

Private sub ляля2()
.... 'твой код
end sub
Автор: DimidROLL
Дата сообщения: 24.05.2006 19:15
DONRU1
Хм, мысль хорошая, спасибо! Попробую!
Автор: Fluk
Дата сообщения: 25.05.2006 05:24
Народ, подскажите как заполнить поля в UserForm значениями из текущей строки?
Проблема в заполнении свойства ControlSource поля TextBox формы. Все перепробовал - Invalid property value...

Видимо это так просто, что ни в мануале, ни в инете не находится..
Автор: Preston
Дата сообщения: 25.05.2006 14:37
Подскажите пожалуйста, в чем может быть проблема. Код примерно следущий:

Код: Private Sub CommandButton1_Click()

Dim WWW(5) As Double

Dim i As Integer

Sheets("Лист1").Select

For i = 1 To 5

WWW(i) = Cells(0 + i, 1)

Next

For i = 1 To 5

Sheets("Лист2").Select

Cells(0 + i, 1) = WWW(i)

Next

End Sub
Автор: Troitsky
Дата сообщения: 25.05.2006 17:28
Preston
А так:
Код: Private Sub CommandButton1_Click()

Dim i As Integer

For i = 1 To 5
Sheets("Лист2").Cells(i, 1).Value = Sheets("Лист1").Cells(i, 1).Value
Next

Sheets("Лист2").Activate

End Sub
Автор: avk06
Дата сообщения: 25.05.2006 17:55
Подскажите как сделать. Имеется файл, где, в частности есть парочка столбцов:

2460739     грн/м2. сдача 4кв2007
5100548    
4582773     с 1.05
67.1108868    
2421671    
5743668     хрущовка торг
4121525     торг 1кв2008
97.5108924     сд-4кв.07г
67.4096769     Н=3.3м.тр.рем.отличный вид.торг
5381166    

Задача следующая- если в первом столбце длина числа больше 7 символов, то это число надо удалить из первого столбца и добавить это число в начало следующего столбца.
Автор: Preston
Дата сообщения: 25.05.2006 21:56
Troitsky
Спасибо, такой код работает. Но только вот мой код не работает.
Автор: Yuk
Дата сообщения: 25.05.2006 22:10
Preston
Делай так:

Код: Sheets("Лист2").Cells(0 + i, 1) = WWW(i)
Автор: Troitsky
Дата сообщения: 26.05.2006 10:29
Yuk

Цитата:
По-моему, объект Cells по умолчанию ассоциируется с первым листом.

А, по-моему, все таки с активным

Preston

Цитата:
Но только вот мой код не работает.

Может быть в ячейках, значения которых переносятся во второй лист, содержится текст и при попытке присвоения текстового значения переменной типа Double (члены массива WWW), разумеется, возникает 13-я ошибка (Type mismatch). Но это все догадки - ты ведь не пишешь в чем выражено нежелание кода работать.
А вообще лучше игнорировать все возможные "по умолчанию" и использовать запись вида Лист.Диапазон.Свойство. Например, Sheets(1).Cells(1, 1).Value

Автор: Preston
Дата сообщения: 26.05.2006 13:17
Yuk и Troitsky спасибо за подсказку. Действительно при указании Sheets("Лист2").Cells(0 + i, 1) он передает значения на второй лист.
Автор: DimidROLL
Дата сообщения: 29.05.2006 14:39
У меня вот такой ещё возник вопрос, как я уже писал до этого, у меня решается транспортная задача.
Весь путь судна разбит на 120 с лишним участков, задано начало действия модели.
И так начиная с 1го заканчивая последним блоком, идёт складывание времени (в VBA)
То есть, к начальному времени прибавляется время первого блока, ко времени первого блока прибавляется время второго итд. С изменением времени года в отдельных блоках меняются условия, что влияет на время, так же когда лето судно ходит по одному маршруту, когда наступает зима, судно начинает ходить по сокращённому маршруту.

Мой вопрос: Как в Excel VBA грамотно сделать цикл, чтобы после прохождения первого круга (цикла), следующий круг начинался не с начального времени, а со времени окончания первого круга, то есть, чтобы постоянно росло текущее время.
Плюс к тому, не совсем понятно как зациклить программу с оператором IF

Принцип моей программы вкратце выглядит так:

Начальная дата (число месяц год часы минуты)
Начальное время 0

Из порта А идём в порт Б (только летом)
Далее из порта Б идём в порт В, из В в Г итд.
Потом возвращаемся через все порты идём обратно
Те из Г в В из В в Б
Дальше наступает момент истины и проверяется время года:
Если лето то идём в порт А

Если зима то идём обратно в порт В итд, пока лето не наступит…

В общем, жуткая муть…

Если у кого-нибудь есть какие-нибудь соображения, очень бы хотелось их услышать
Заранее спасибо!

Автор: SZap
Дата сообщения: 29.05.2006 15:28
DimidROLL
Не совсем понятен алгоритм...
А так, задача не очень сложная...
Автор: Troitsky
Дата сообщения: 29.05.2006 17:04
DimidROLL
Как я понял твою задачу: судну нужно выполнить 120 рейсов между портами А, Б, В и Г. В определенное время года судоходная обстановка не позволяет совершать рейсы на участке АБ, поэтому судно вместо того чтобы пройти его транзитом будет производить в нем погрузку/выгрузку.


Немного изменив условия, можно написать [more=вот такой код]
Код: Dim i As Integer ' счетчик рейсов
Dim j As Integer ' номер текущего порта
Dim k As Integer ' направление движения
' 1 - вперед;
' -1 - назад.

' Начальные условия
k = 1 ' движемся вперед
j = 1 ' находимся в первом порту

For i = 1 To 120
j = j + k
' совершаем i-й рейс в j-й порт

' по прибытии в j-й порт задаемся направлением следующего рейса
' (рейсы с 38 по 73 делаем без захода в первый порт)
If i > 38 And i < 73 Then
If j = 2 Or j = 4 Then k = k * (-1)
Else
If j = 1 Or j = 4 Then k = k * (-1)
End If

Sheets(1).Cells(i, 1).Value = i
Sheets(1).Cells(i, 2).Value = j
Next i

Sheets(1).ChartObjects.Add 100, 30, 400, 250
Sheets(1).ChartObjects(1).Activate
ActiveChart.ChartType = xlXYScatterLines
ActiveChart.SetSourceData Source:=Sheets(1).Range("A1:B120"), PlotBy:=xlColumns
Автор: DimidROLL
Дата сообщения: 29.05.2006 20:55
SZap
Не сложная да, не так проста...

Troitsky

К сожалению не совсем правильно ты меня понял или я объяснил.

Цель: Судно курсирует между 5 портами, одним речным(Нижний Новгород),
и пятью морскими (Санкт-Петербург, Стокгольм, Копенгаген, Лондон, Гавр)
Судно заходит и разгружается/загружается в каждом порту.

Летом судно курсирует на линии:
Нижний Новгород - Санкт-Петербург - Стокгольм - Копенгаген - Лондон - Гавр.

Зимой судно курсирует на линии:
Санкт-Петербург, Стокгольм, Копенгаген, Лондон, Гавр

Суть в том, что я в Excel разбил весь путь на 120 с лишним блоков, в каждом из них с использозованием случайных чисел вычисляется время блока. В VBA же я пытаюсь сделать сложение всех этих блоков с учётом времени года, то есть если лето то складывать все блоки, если же зима, то складывать то лько те блоки которые доступны зимой и так в течении года. (То есть выполняем не 120 рейсов, а какое то количество рейсов в течении года.)

Вот здесь мой рабочий файл
_http://user.rol.ru/~ladeynov/02.05.06_SM_Excel%202.1.3.rar
Автор: SZap
Дата сообщения: 30.05.2006 11:28
DimidROLL
На сколько я понимаю, решением этой задачи является расчет времени, затраченного каждым из N судов на выполнение K рейсов, с разбивкой по блокам и рейсам, с учетом времени года и следовательно маршрута движения. Я прав?

ОСНОВНАЯ НА МОЙ ВЗГЛЯД ПРОБЛЕМА ДАННОЙ СИСТЕМЫ:
Система работает только с условием одинаковой загрузки/разгрузки в портах. На практике, по моему, это не совсем так, но в этом случае могут возникнуть критические ошибки с загрузкой судна, она может уйти в минус, а может и превысить грузоподъемность судна, в связи с изменением маршрута движения. Более того, очевидным является и тот факт, что при каждом рейсе во всех портах производится одинаковая загрузка/разгрузка.

И еще, строки время и "Глобальное время" актуально только для последнего рейса
Не знаю, может это и не нужно, но мне так не кажется...

ПРЕДЛОГАЮ:
1. Расширенная таблица "загрузка/разгрузка" с данными для всех рейсов...
2. Промежуточные и итоговые результаты выводить на отдельном листе в формате что-то типа: Судно, №рейса, Глобальное время, Блок (или Порт по желанию), Время на операцию
3. Изменить расположение блоков таким образом, чтобы была возможность работать через цикл (для удобства)




Автор: DimidROLL
Дата сообщения: 30.05.2006 13:13
SZap
Да, идея такова, мне нужно собрать время за рейс и за год для каждого из пяти судов. И собственно вывести эти данные для анализа. То есть мне в принципе то нужно только общее время. А не на каждом блоке.


Цитата:
ОСНОВНАЯ НА МОЙ ВЗГЛЯД ПРОБЛЕМА ДАННОЙ СИСТЕМЫ:
Система работает только с условием одинаковой загрузки/разгрузки в портах. На практике, по моему, это не совсем так, но в этом случае могут возникнуть критические ошибки с загрузкой судна, она может уйти в минус, а может и превысить грузоподъемность судна, в связи с изменением маршрута движения. Более того, очевидным является и тот факт, что при каждом рейсе во всех портах производится одинаковая загрузка/разгрузка.


По поводу одинаковости количества разгрузки/погрузки, я с тебя не совсем понял, у меня же создана таблица задающая сколько в каком порту будет выгружаться=загружаться (пока что только так, друго го наверное уже и не будет)
А при последующем круге или опыте, данные автоматом изменятся, ибо я же использовал в этих ячейках функцию СЛУЧМЕЖДУ()


Цитата:
И еще, строки время и "Глобальное время" актуально только для последнего рейса
Не знаю, может это и не нужно, но мне так не кажется...


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

А время каждого рейса для каждого судна естественно должно выводиться в отдельную область. Просто я это ещё не расписал.



Цитата:
3. Изменить расположение блоков таким образом, чтобы была возможность работать через цикл (для удобства)


Если можно не совсем понял как это лучше сделать.

P.s.
Признаться, с VBA я не очень, как собственно и с программированием, просто столкнулся с такой проблемой при написании диплома, кстати его уже до 15 июня надо закончить... в 20х числах защита... А я всё никак программу сделать не могу...
Автор: avk06
Дата сообщения: 30.05.2006 13:35
Знатоки VBA помогите.

Требуется из файла excel скопировать некоторые столбцы(но не все) в другой файл и расположить их при этом в определенном порядке.
Естественно, требуется не одноразовая операция по копированию, а постоянно производить эти действия с файлами.

Например в исходном файле есть такие столбцы и в такой последовательности:
Кол-во комнат
Планировка
Цена
Район
Улица
Общая площадь
Жилая площадь
Кухня
Этаж
Этажность
А в конечном файле требуется скопировать данные таких столбцов и в такой последовательности :
Комнат
Планировка
Район
Улица
Этаж
Этажность
Жилая площадь

И такую процедуру требуется повторять каждый день с файлом со свежими данными. Как это реализовать програмно? Через VBA? Я его не знаю, к сожалению. Может какой-то текст программы набросаете?
Автор: vitalij zayac
Дата сообщения: 30.05.2006 14:09
Как создать панель иниструментов в MS Excel с двумя кнопками


Добрый день.

Возникла проблема: надо создать панель инструментов с двумя кнопками, при нажатии которых запускались бы на выполнение мои проги *.exe, написанные на C++ Builder. (VB совсем не знаю :(
Помогите плз, что надо почитать, или примерчик какой посмотреть. Я просто не знаю в какую сторону бежать.

ПОМОГИТЕ!
Автор: MrZeRo
Дата сообщения: 30.05.2006 14:36
vitalij zayac
1. Записать макрос вида

Цитата:

Sub Макрос1()
Shell ("my_favorite_program.exe")
End Sub

2. Пойти в меню сервис-настройка, там слева выбрать "Макросы", справа "Настраиваемая команда меню", вытянуть на панель и по правой кнопке назначить записанный макрос.

Макрос можно протестировать отдельно из редактора VisualBasic.
Автор: Yuk
Дата сообщения: 30.05.2006 17:42
avk06
Я тебе уже ответил в Excel FAQ. Задача не сложная, попробуй сделать через запись.
В исходных файлах все время одинаковая последовательность столбцов? Второй файл должен каждый раз создаваться новый, или новые данные добавляются в конец старых?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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