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

» Excel VBA (часть 3)

Автор: aidomars
Дата сообщения: 14.11.2013 14:58
kovireshad
http://rghost.ru/50167327
Автор: 1122111
Дата сообщения: 14.11.2013 19:44
есть такой макрос

Код:
Private Declare Function ActivateKeyboardLayout _
Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
Const kb_lay_ru As Long = 68748313, kb_lay_en As Long = 67699721

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Count > 1 Then Exit Sub
' запрет на ввод русских букв в столбцы 2 и 5
If Target.Column = 2 Or Target.Column = 5 Then
If Target Like "*[А-Яа-яЁё]*" Then
' если есть хоть одна русская буква
MsgBox "Ввод русских букв недопустим!", vbCritical
Target.Value = "" ' очистка ячейки
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Target.Column ' в зависимости от номера столбца активной ячеки
Case 1, 3, 6 ' для столбцов 1, 3, 6
ВключитьРусскуюРаскладку
Case 2, 5 ' для столбцов 2, 5
ВключитьАнглийскуюРаскладку
Case Else: ' ничего не делаем (оставляем текущую раскладку)
End Select
End Sub

Sub ВключитьРусскуюРаскладку()
' Переключить на русский язык
x = ActivateKeyboardLayout&(kb_lay_ru, 0)
End Sub

Sub ВключитьАнглийскуюРаскладку()
' Переключить на английский язык
x = ActivateKeyboardLayout&(kb_lay_en, 0)
End Sub


не работает в экселе 2010 64бит что делать?[code][/code]
Автор: andrewkard1980
Дата сообщения: 14.11.2013 20:10
1122111
Подозреваю, что дело в dll "user32"
Автор: AndVGri
Дата сообщения: 15.11.2013 02:19
1122111
Для 64 лучше использовать (не забудьте указывать правильный тип переменных, принимающих результаты функций)

Код:
Declare PtrSafe Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As LongPtr
Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" Alias "ActivateKeyboardLayout" (ByVal HKL As LongPtr, ByVal flags As Long) As LongPtr
Declare PtrSafe Function UnloadKeyboardLayout Lib "user32" Alias "UnloadKeyboardLayout" (ByVal HKL As LongPtr) As Long
Declare PtrSafe Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Автор: kovireshad
Дата сообщения: 15.11.2013 15:38
aidomars
Огромное спасибо, все получилось
Автор: 1122111
Дата сообщения: 16.11.2013 10:53
[q][/q]
выдает ошибку на


Код: Sub ВключитьАнглийскуюРаскладку()
' Переключить на английский язык
x = ActivateKeyboardLayout&(kb_lay_en, 0)
End Sub
Автор: AndVGri
Дата сообщения: 16.11.2013 15:00
1122111
Вы объявления для 64бит посмотрели? Константы для кода языка как LongPtr объявили? Почему результат функции объявлен как тип Long (из суффикса & следует)?
Автор: 1122111
Дата сообщения: 17.11.2013 23:05
[q][/q]
выдает ошибку на


Код: Sub ВключитьАнглийскуюРаскладку()
' Переключить на английский язык
x = ActivateKeyboardLayout&(kb_lay_en, 0)
End Sub
Автор: kovireshad
Дата сообщения: 18.11.2013 08:19
aidomars
Большое спасибо, все получилось, перенесла в свой документ , все работает
Автор: olezya
Дата сообщения: 19.11.2013 19:19
Здравствуйте
Помогите, пожалуйста, написать в экселе макрос.
У меня есть допустим зрительный зал.
Выделяю места для приглашенных каким-то цветом, указывая (думаю, что с помощью примечания) кто-где сидит (не знаю как сделать, чтобы выделить несколько мест, допустим, для одного отдела или управления, не важно)
Мне на втором листе пишет в каком ряду в каком месте какой отдел, управление или человек (думаю здесь дожна быть привязка к цвету выделения ячеек)
ну и ясно суммирует количество пустых или занятых мест, указывая где находятся пустый (ряд и место)

ряд и место - это значения в ячейках

Спасибо за помощь
Автор: vlth
Дата сообщения: 20.11.2013 00:06
1122111


Код: Private Declare PtrSafe Function ActivateKeyboardLayout Lib _
"User32" (ByVal HKL As Long, ByVal flags As Long) As Long
Автор: galex87
Дата сообщения: 21.11.2013 12:17
LaCastet
panda3
Спасибо! Попробую.

Возник еще один вопрос по этой же задаче. Данные придется брать из другой книги. Думаю, что задачу поиска данных можно решить добавлением имени книги к "Sheets("Лист1").Columns("B:B").Select".
А как вообще правильно работать одновременно с несколькими книгами? Я пока что нашел такие решения:
1. Прописывать полный путь до ячейки. В этом случае текст получается очень громоздкий.
2. Попеременно делать книги активными, чтобы избежать длинных путей. В этом случае легко можно запутаться.
3. Копировать нужные листы из другой книги в текущую, а после завершения работы с этими листами, удалять их. Это как-то неправильно.
Автор: panda3
Дата сообщения: 25.11.2013 07:24
galex87
Не понял, зачем делать активными, если вы на VBA пишете? Активная книга - это для действий пользователя. Присваивайте книгу переменной w = Workbooks(...) и работайте через нее.
Автор: AndyKKKK
Дата сообщения: 25.11.2013 12:35
Здравствуйте. Поставлена такая задача: есть файл Excel, в котором в один столбец по строкам вписан текст. Каждая строка - это новое предложение. Нужно перенести эти предложения в DBF файл, при этом каждое предложение из строки Excel, в случае если оно не вмещается в 63 знака, должно быть разбито на несколько записей в DBF по 63 знака, при этом записи одного предложения в DBF нумеруются за одним номером. Как это лучше сделать?
Автор: shune4ka
Дата сообщения: 29.11.2013 06:55
https://drive.google.com/file/d/0B16thjjI9osNektkUW9lblJMbXM/edit?usp=sharing

Добрый день.

Есть эксель с макросами, но он подтормаживает из-за большого объема информации...нужно как-то его убыстрить...
печать по 3м форматам, в зависимости от кода для печати.

Помогите пожалуйста.

Заранее благодарна.
Автор: Spy686
Дата сообщения: 30.11.2013 15:00
здравствуйте,
подскажите пожалуйста.
надо заполнить столбец из 30 строк цифрами от 0 до 1, но так что бы сумма была 14.

помогите pls !!!
Автор: vikkiv
Дата сообщения: 30.11.2013 18:44
Spy686 ну цифрами так цифрами, числами было-бы немного замороченнее:
Код: Sub testx(): Dim arr(1 To 30, 1 To 2) As Double: For i = 1 To 14: arr(i, 1) = 1: Next i: For j = 1 To 30: arr(j, 2) = Rnd(): Next j: Range("A1:B30") = arr
Range(Cells(1, 1), Cells(30, 2)).Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlNo: Columns("B").Clear: End Sub
Автор: SamuraiSan
Дата сообщения: 16.12.2013 18:23
Здравствуйте! Помогите пожалуйста с макросами.
1). Создать макрос, который запускает форму на выполнение. Форма позволяет ввести натуральное число n и по нажатой кнопке "Результат" выводит наименьшее простое число больше n. Как это именно написать? Форма готова, начало макроса тоже, только с наименьшим простым числом больше n проблемка, додуматься не могу...
2). http://radikale.ru/data/upload/4fa6c/4efc3/eaf2cb224a.jpg
Определить по каждому предмету количество пятерок (результат в ячейку B13:D13), количество двоек (B14:D14).
Пытаюсь решить, не получается ничего
Помогите пожалуйста!
Автор: aidomars
Дата сообщения: 17.12.2013 06:34
SamuraiSan
По первому вопросу непонятно, что за число должно получиться? Пример нужен.
По второму просто формула: =СЧЁТЕСЛИ(B4:B12;2)
Автор: SamuraiSan
Дата сообщения: 17.12.2013 07:53
aidomars,
Вот такая форма: http://radikale.ru/data/upload/4efc3/04012/dcdf3bb792.jpg
Например, вводишь число 1, и по нажатию "Результат" он должен выдасть число 2, вводишь число 2-он выдает 3, вводишь 3-он выдает 5 и т.д. Он должен выдасть простое число, то есть то, которое делится на 1 и на само себя. И оно должно быть наименьшим числом больше вводимого. То есть 1 вводим, а он выводит 2 (а не 3 например).
А по второй задаче спасибо, но там тоже макрос написать нужно, я забыла это написать. Извините.
Автор: aidomars
Дата сообщения: 17.12.2013 11:33
SamuraiSan

Код: Sub ПростыеЧисла()
n = 5
For n = n + 1 To 1000
f = 1
For k = 2 To n - 1
If n Mod k = 0 Then
f = 0
Exit For
End If
Next
If f = 1 Then
MsgBox n & " - простое число"
Exit For
End If
Next
End Sub
Автор: SamuraiSan
Дата сообщения: 17.12.2013 13:13
aidomars,
Большое спасибо! И ещё вопрос: а можно сделать так, чтобы во 2й задаче нужные оценки выводились в ячейки после запуска макроса? А то они выводятся сразу после открытия документа, даже когда запуск макросов отключен.
Автор: aidomars
Дата сообщения: 17.12.2013 16:12

Цитата:
А то они выводятся сразу после открытия документа

Это формула там остается, стирайте ее перед сохранением.
Автор: SamuraiSan
Дата сообщения: 17.12.2013 18:45
aidomars,
Спасибо за помощь.
Автор: Alyrain
Дата сообщения: 19.12.2013 15:34
Какая то ошибка с циклами. Выделяет Next i и пишет, что он без For.

Dim G(1 To 16, 1 To 9) As Single
Dim l As Integer
Dim k As Integer
Dim a As Integer
Dim i As Integer
Dim s1 As Integer

Sheets("Лист1").Select
For l = 1 To 16
k = 0
For i = 1 To 9
a = Cells(i + 3, l + 1)
If a = "-" Then
k = k + 1
Next i
Cells(13, l + 1) = k
If k > Max Then
Max = k
s1 = Cells(3, l + 1)
End If
Next l
Cells(14, 2) = s1

End Sub
Автор: dneprcomp
Дата сообщения: 19.12.2013 16:21
Alyrain
Видимо я не совсем ясно выразился в топике по VB. Я ведь рекомендовал будущие вопросы по програмированию в Excel помещать здесь. Ладно, oтвечу и тут.

Код: Sheets("Лист1").Select
For l = 1 To 16
k = 0
For i = 1 To 9
a = Cells(i + 3, l + 1)
If a = "-" Then
k = k + 1
End If
Next i
Cells(13, l + 1) = k
If k > Max Then
Max = k
s1 = Cells(3, l + 1)
End If
Next l
Cells(14, 2) = s1
Автор: Alyrain
Дата сообщения: 19.12.2013 16:40
я поняла. НО, If я уже и закрывала, но при запуске выделяет Next после k=k+1 и пишет что нет For. Я не понимаю, где мне его нужно поставить( После закрытия If, выдает ошибку о несоответствии типов
Автор: andrewkard1980
Дата сообщения: 19.12.2013 22:10
Alyrain
Выше приведенная часть кода вполне корректна, надо смотреть весь код, что бы понять где ошибка и почему.
Автор: dneprcomp
Дата сообщения: 20.12.2013 03:58
Alyrain
If должен стоять именно там где выделено красным. Без него работать не будет.
На исполнении какой строки выдает "ошибку о несоответствии типов"?
Прогоните код в дебаге, используя F8

Добавлено:
Попробуйте везде обращатся к значению cell используя value

Код: К примеру:
a = Cells(i + 3, l + 1).value
Cells(14, 2).value = s1
Автор: pas16
Дата сообщения: 22.12.2013 00:51
Ребята помогите, пожалуйста, сделать макрос для Excel. Макрос должен удалять первый символ из выделенной области ячеек, если ячейка начинается на символом S и содержит 11 символов. Вроде как должно быть просто, но ни с созданием макросов для Excel, ни с VBA не дружу. Буду очень благодарен.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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