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

» Excel VBA (часть 3)

Автор: Niiks
Дата сообщения: 03.06.2011 19:39

Цитата:
Отчитайтесь, плз, по работоспособности.

asbo, отчитываюсь,. плз.: покой и тишина.

Автор: asbo
Дата сообщения: 03.06.2011 20:02
Niiks, грустно...
Попробуйте следующее:
1. Убедитесь, что Вы именно этот файл скачали, вторую версию.
2. Установите Сервис - Параметры - Безопасность - Безопасность макросов - Уровень безопасности - Средняя. Откройте файл. В диалоге ответьте "Не отключать макросы".
Автор: Niiks
Дата сообщения: 03.06.2011 20:29

Цитата:
Попробуйте следующее:
1. Убедитесь, что Вы именно этот файл скачали, вторую версию.
2. Установите Сервис - Параметры - Безопасность - Безопасность макросов - Уровень безопасности - Средняя. Откройте файл. В диалоге ответьте "Не отключать макросы".

asbo, именно так я всё и делал. Win XP SP3.

Цитата:
Niiks, грустно...

Не то слово...


Автор: asbo
Дата сообщения: 03.06.2011 21:02
Niiks, дружище, а может у Вас динамик просто не работает?
Сделайте вот что:
1. Win+R
2. Наберите cmd, нажмите Enter
3. Ctrl+G, нажмите Enter
4. Alt+7(numpad), нажмите Enter

На шагах 3 и 4 должно загудеть по разу.

Автор: Niiks
Дата сообщения: 03.06.2011 22:44

Цитата:
На шагах 3 и 4 должно загудеть по разу.

asbo, всё сделал как Вы учили -звука нет.
what's the problem?



Добавлено:
Вот моя проблема:
Вот файл
Надо чтобы при вводе данных при переходе за границы таблиы на ячейки N5 N6 N7 N8 N9 или на A4 - M4 или на A4 - A9 - раздавался бы beep.
Автор: smirnvlad
Дата сообщения: 04.06.2011 08:36
Niiks

Цитата:
what's the problem?

Внутренний динамик отсутствует/не подключен/отключен в настройках звука/сгорел/другая менее вероятная причина
Ещё варианты beep, но через колонки а не динамик. Можно и свой wav-файл играть
[more]
Код: [no]
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000

Public Declare Function sndPlaySound32 _
Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long) As Long

Private Declare Function PlaySound _
Lib "winmm.dll" _
Alias "PlaySoundA" ( _
ByVal lpszName As String, _
ByVal hModule As Long, _
ByVal dwFlags As Long) As Long

sndPlaySound32 "-", SND_ASYNC
PlaySound "-", 0&, SND_ASYNC Or SND_FILENAME
[/no]
Автор: asbo
Дата сообщения: 04.06.2011 08:52
Niiks, не работает (не подключен, сломан, отсутствует) спикер.

Ваш файл я щаз сделаю в варианте для рабочего спикера.

А по работоспособности спикера-бипера-пищалки обращайтесь в профильную, железную тему - мы здесь и так по пустяковому вопросу нафлудили. При обращении туда выясните и опишите:

Присутствует ли спикер физически?
При загрузке BIOS что-нибудь пикает?
А звуковая карта в компе есть?
Какой комп - десктоп, ноут-нетбук?


Цитата:
... раздавался бы beep
не глумитесь :)))
Скоро уже все заорут хором: "Beep, speaker, beep!"
Автор: asbo
Дата сообщения: 04.06.2011 11:11
Niiks, вот вариант согласно Вашему последнему ТЗ

Цитата:
чтобы при вводе данных при переходе за границы таблиы на ячейки N5 N6 N7 N8 N9 или на A4 - M4 или на A4 - A9 - раздавался бы beep

Замечу, что оно существенно изменилось относительно начального

Цитата:
что-бы при вводе какого-либо значения в определённую ячейку - раздавался бы звуковой сигнал

Так дела не делаются. Не добившись результата в простом варианте, следует принципиальное усложнение задания... Тем более в определениях, ясность которых оставляет желать... Написал Вам в личку, но ответа не дождался. Будучи уже втянут в Вашу задачу, сделал так, как смог понять:

Поле ввода: B5:M9
Верхний заголовок: A4:M4
Левый заголовок: A4:A9

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

В этой версии задействованы оба варианта, предложенные smirnvlad (снкс). Правда у меня они оба гудят через спикер. Т.о. на моем железе гудит все, кроме первого, стандартного VBA-шного Beep. Все гудит через спикер.

Изменять способ подачи сигнала можно в модуле Cmp, в процедуре sb_RangesDefine. Нужно на последнюю строку в списке поместить нужный тип сигнала.


Код: ' last line will be effective
tTyp = DO_BPO ' beep once
tTyp = DO_KRO ' kernel once
tTyp = DO_KRM ' kernel many
tTyp = DO_WN1 ' winmm once 1
tTyp = DO_WN2 ' winmm once 2
' last line will be effective
Автор: Amrek
Дата сообщения: 06.06.2011 07:05
Уважаемый asbo и другие форумчани.

Понадобилось ограничить в одном файле доступ к разным ячейкам, а именно допустим пользователь Вася имел бы доступ к строке 1, ячейки с 3 по 5. Пользователь Коля к строке 2, ячейки с 3 по 5 и т.д. Доступ подразумевает что пользователь может как угодно менять информацию в этой ячейке, а в остальных нет. Так же в ячейке 5 пользователь должен добавлять ссылку на файл (Гиперссылку). В выложенном ниже примере, все реализовано кроме гиперссылки. Существует ли возможность в данном примере реализовать такой механизм. На лист добавляем кнопку с функцией добавление гиперсылки. Допустим зашел пользователь Коля. Ему стали доступны его ячейки. Он выделяет строку 2 ячейку 5 и нажимает кнопку добавить гиперсылку. И открывается окно добавление файлов. При выборе другой ячейке чтобы кнопка не срабатывала.

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


Пароль на лист 123
Пароли пользователей:
user = Array("Вася", "Петя", "Витя", "Коля")
parol = Array("111", "222", "333", "444")
Пример выполнен на Exel 2007
http://rghost.ru/9561671
Автор: asbo
Дата сообщения: 06.06.2011 09:40
Amrek, сохраните свой файл для 2003. Я не работаю с 2007 и моложе.

Исходя из того, что Ваша защита работает корректно, могу порекомендовать:

В модуль Module2 поместите код процедуры sb_CommandButton1_Click_Proceed.
На лист поместите кнопку CommandButton1, а в модуль листа - процедуру обработки события клика по ней. Ограничения - предполагается, что будет выделена единственная ячейка, а не диапазон и не множественное выделение. [more=Код:]

Код:
' *** Лист2
Private Sub CommandButton1_Click()
Call sb_CommandButton1_Click_Proceed
End Sub

' *** Module2
Public Sub sb_CommandButton1_Click_Proceed()
Dim rng As Range
Set rng = Selection
With rng
Select Case .Column
Case 5
Select Case .Hyperlinks.Count > 0
Case True
' do something
Case False
' do something
Application.Dialogs(xlDialogInsertHyperlink).Show
End Select
Case Else
' do something
End Select
.Select
End With
End Sub
Автор: Amrek
Дата сообщения: 06.06.2011 09:57
С кнопкой разобрались, все работает только в том случае если мы ставим защиту руками и ставим галочку разрешить пользователям добавлять гиперсылку, а вот если макросом, то нет. Как я понимаю Макросом включается стандартная защита, а именно не стоит галочка разрешить пользователю добавлять гиперссылку. Осталось понять где в макросе это прописывается.
Автор: asbo
Дата сообщения: 06.06.2011 10:14
Amrek
Module2, Ln 29:
Sheets("Предписания").Protect ("123")
Sheets("Предписания").Protect Password:="123", AllowInsertingHyperlinks:=True

VBA Help - Protect Method:
Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables)
Автор: Amrek
Дата сообщения: 06.06.2011 10:43
Спасибо, то что надо
Автор: InSe0F
Дата сообщения: 06.06.2011 12:49
Всем привет. Есть небольшая задачка, надо отсортировать много текста в ячейках.
В ячейке лежит текст который забит на строки (вводился через alt+enter)
надо отсортировать в каждой ячейке текст так чтобы он стал отсортированым по возрастанию

Например
Ячейка1:
Гдва
123
Авбва

Должно стать:
123
Авбва
Гдва

Запускаться скрипт должен на диапазоне ячеек, сортируя в каждой текст отдельно.

Буду премного благодарен за помощь

Автор: ZlydenGL
Дата сообщения: 06.06.2011 12:56
Я бы это написал вот такой функцией:


Код: Function mySort(txt As String) As String
Dim Arr() As String, temp As String, I As Long, Check As Boolean
Arr = Split(txt, vbLf)
Check = False
While Check = False
Check = True
For I = 0 To UBound(Arr) - 1
If Arr(I) > Arr(I + 1) Then
temp = Arr(I)
Arr(I) = Arr(I + 1)
Arr(I + 1) = temp
Check = False
End If
Next I
Wend
mySort = Join(Arr, vbLf)
End Function
Автор: InSe0F
Дата сообщения: 06.06.2011 13:14
Спасибо за оперативность! Работа не встала, странно у меня с символом переноса все ок.
Автор: asbo
Дата сообщения: 06.06.2011 14:14
ZlydenGL

Цитата:
В итоговую ячейку результат возвращается в одну строку

У меня также. С квадратиками. Если принудительно включить в ней перенос, то нормально становится.

Цитата:
Забавно, ... Activecell = "1" & vbLf & "2" ... возвращает текст с правильным оформлением

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

Добавлено:
InSe0F
Цитата:
у меня с символом переноса все ок

Значит ячейка уже была сформатирована с переносом.
Автор: Amrek
Дата сообщения: 06.06.2011 15:48
Такой вопрос, а возможно ли сделать такое:

Как сейчас: Когда пользователь нажимает Гиперссылка и указывает файл, на своем компе то ссылка приобритает вид C:\Documents and Settings\user\Рабочий стол\файл И если теперь попробовать открыть эксель с другого компа и попробовать открыть эту ссылку ничего не получится.

Что бы хотелось, при нажатии на кнопку добавить файл открывалось окно выбора файла, выбираем абсолютно любой файл, в любом месте. Жмем ок. Далее файл копируется на сетевой диск, а в экселе появляется ссылка на этот файл на сетевом диске.

Такое вообще возможно средставми Екселя?
Автор: asbo
Дата сообщения: 06.06.2011 16:57
Amrek
Можно пнуть Васю-111, чтобы он предварительно копировал файло на сетевой ресурс и ссылался исключительно на него :)

Подключить библиотеку Microsoft Scripting Runtime (scrrun.dll). Имея уже сгенерированную ссылку (путь-имя), заслать этот файл в сетевую папку и поправить ссылку.
Автор: 4t
Дата сообщения: 06.06.2011 20:00
Есть таблица, как сделать чтобы в пустые клетки добавилось вышестоящее значение.

№245 1 342
Автор: ZlydenGL
Дата сообщения: 06.06.2011 20:23

Код: =if(A2="";D1;A2)
Автор: asbo
Дата сообщения: 06.06.2011 20:26
4t
Руками внести. Формулами сослаться. Причем тут "Прикладное программирование » Excel VBA"?
Автор: 4t
Дата сообщения: 06.06.2011 20:53
Вот такая вот формула пишет ошибку "#ИМЯ?" мож в формуле чего поправить надо?

Добавлено: Разобрался, ток работает через одну ячейку. Поиграюсь с формулами...

asbo
Цитата:
4t
Руками внести. Формулами сослаться. Причем тут "Прикладное программирование » Excel VBA"?

Что руками внести?, столбцов не одна сотня. Не знал куда запостить, сюда или в FAQ, запостил сюда...
Автор: asbo
Дата сообщения: 06.06.2011 22:32
Не надо "играться". Замените в формуле "if" на "ЕСЛИ". Все работает, как положено.
Автор: Amrek
Дата сообщения: 07.06.2011 07:55
asbo

А если не сложно маленький примерчик наглядный возможно сделать?
Автор: asbo
Дата сообщения: 07.06.2011 08:33
Amrek, по какому из пунктов? Что именно вызывает у Вас трудности?
См. хэлп по File System Object.

Впрочем, можно ведь и стандартными функциями VBA.FileSystem обойтись. Только, имо, для Вашей задачи лучше воспользоваться специализированным инструментом.
Автор: Amrek
Дата сообщения: 07.06.2011 10:42
Так с этим победили, другой вопрос как сделать чтобы Гиперсылка отображалась не путем к файлу, а только имя файла? Чтобы в ячейке не писалась лишняя ненужная информация.

Было: C:\temp\fdsf\1.doc

Надо: 1.doc
Автор: asbo
Дата сообщения: 07.06.2011 10:48
Amrek, InstrRev - ищем позицию первого обратного слэша справа.
Автор: Amrek
Дата сообщения: 08.06.2011 15:18
Такой вопрос, а как то можно запретить изменять макрос? либо просматривать код? Хотя бы простых юзверей, сломать можно все если захотеть
Автор: ZlydenGL
Дата сообщения: 08.06.2011 15:25
Tools - VBA project Properties - вкладка Protection спасет отца русской демократии

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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