Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Работа с объектом Range - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Работа с объектом Range
Hugo Дата: Четверг, 16.08.2012, 10:38 | Сообщение № 21
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Признаю, файлы не смотрел.
Почему не работал - не знаю, xlsm у меня возможно через конвертер работать будет неправильно, поэтому даже не пытаюсь качать.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПризнаю, файлы не смотрел.
Почему не работал - не знаю, xlsm у меня возможно через конвертер работать будет неправильно, поэтому даже не пытаюсь качать.

Автор - Hugo
Дата добавления - 16.08.2012 в 10:38
A_3485 Дата: Четверг, 16.08.2012, 10:43 | Сообщение № 22
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 146
Репутация: 0 ±
Замечаний: 40% ±

2007
Hugo, вот этот код:

[vba]
Code
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Dim KeybLayoutName As String

Const HOOKED_KEYS As String = "f,dult`;pbqrkvyjghcnea[wxio]sm'.z 0123456789@-_\/" 'Lib "fedorov" GetKeyboardLayoutNameA
Function InRange(Target As Range, RangeIn As Range) As Boolean

InRange = Not Intersect(Target, RangeIn) Is Nothing
End Function
Function CaseRanges(strkey As String) As String
If (InRange(ActiveCell, Range("A32:AP34"))) Then
CaseRanges = strkey
Exit Function
End If
If (InRange(ActiveCell, Range("38:46, 55:66")) And strkey <> " ") Then
CaseRanges = "X"
Exit Function
End If
CaseRanges = UCase(strkey)
End Function

Function ChangeLang(strkey As String) As String

Const KEYB_RUS As String = "00000419"
Const KEYB_ENG As String = "00000409"
Dim CharsRus As String, CharsEng As String
CharsRus = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
CharsEng = "F<DULT~:PBQRKVYJGHCNEA{WXIO}SM"">Zf,dult`;pbqrkvyjghcnea[wxio]sm'.z"

KeybLayoutName = String(9, 0)
GetKeyboardLayoutName KeybLayoutName

Dim i As Integer
Dim LangRus As Boolean
LangRus = (StrComp(KeybLayoutName, KEYB_RUS, vbTextCompare) = 0)
If LangRus Then
i = InStr(CharsEng, strkey)
Else
i = InStr(CharsRus, strkey)
End If
If i = 0 Then
If LangRus And strkey = "/" Then
ChangeLang = "."
Else
ChangeLang = strkey
End If
Exit Function
End If
If LangRus Then
ChangeLang = Mid(CharsRus, i, 1)
Else
ChangeLang = Mid(CharsEng, i, 1)
End If
End Function

Sub CellEnterFinish(keycode As String)

On Error Resume Next
Dim shift As Boolean
shift = Left(keycode, 1) = "s" ' для поддержки заглавных букв в таких полях, как email, skype и т.п.
If shift Then keycode = Mid(keycode, 2)
strkey = CaseRanges(ChangeLang(Chr(keycode)))
If shift Then strkey = UCase(strkey)
If Not ActiveCell.AllowEdit Then ActiveCell.Next.Activate
ActiveCell.Value = strkey
ActiveCell.Next.Activate
End Sub

Sub HookKeys(Str As String, FuncName As String)

On Error Resume Next
For i = 1 To Len(Str)
s = Mid(Str, i, 1)
If Not IsNumeric(s) Then
Application.OnKey "{" & s & "}", "'" & FuncName & """" & Asc(s) & """'"
If Not InStr("!@#$%^&*()_+~|", s) Then
Application.OnKey "+{" & s & "}", "'" & FuncName & """s" & Asc(s) & """'"
End If
Else
sx = CInt(s) + 96
Application.OnKey s, "'" & FuncName & """" & Asc(s) & """'"
Application.OnKey "{" & sx & "}", "'" & FuncName & """" & Asc(s) & """'"
End If
Next
End Sub

Sub UnHookKeys(Str As String)

On Error Resume Next
For i = 1 To Len(Str)
s = Mid(Str, i, 1)
If Not IsNumeric(s) Then
Application.OnKey "{" & s & "}"
Else
sx = CInt(s) + 96
Application.OnKey s
Application.OnKey "{" & sx & "}"
End If
Next
End Sub

Private Sub RemovePrev()

On Error Resume Next
If ActiveCell.Value <> "" And ActiveCell.Value <> " " Then
ActiveCell.Value = ""
Exit Sub
End If
ActiveCell.Previous.Activate
ActiveCell.Value = ""
End Sub

Private Sub GoToNextField()

Dim next_cell_x As Integer
next_cell_x = ActiveCell.Column + 1
While ActiveCell.Column + 1 = next_cell_x
ActiveCell.Next.Activate
next_cell_x = next_cell_x + 1
Wend
End Sub

Sub НВР_ХРУЩ_ОднаБукваВКаждойЯчейке()

On Error Resume Next
HookKeys HOOKED_KEYS, "CellEnterFinish"
Application.OnKey "{BACKSPACE}", "RemovePrev"
Application.OnKey "{ENTER}", "GoToNextField"
Application.OnKey "~", "GoToNextField"
Application.OnKey "{TAB}"
End Sub

Private Sub Auto_Close()

UnHookKeys HOOKED_KEYS
Application.OnKey "{BACKSPACE}"
Application.OnKey "{ENTER}"
Application.OnKey "~"
End Sub
[/vba]
 
Ответить
СообщениеHugo, вот этот код:

[vba]
Code
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Dim KeybLayoutName As String

Const HOOKED_KEYS As String = "f,dult`;pbqrkvyjghcnea[wxio]sm'.z 0123456789@-_\/" 'Lib "fedorov" GetKeyboardLayoutNameA
Function InRange(Target As Range, RangeIn As Range) As Boolean

InRange = Not Intersect(Target, RangeIn) Is Nothing
End Function
Function CaseRanges(strkey As String) As String
If (InRange(ActiveCell, Range("A32:AP34"))) Then
CaseRanges = strkey
Exit Function
End If
If (InRange(ActiveCell, Range("38:46, 55:66")) And strkey <> " ") Then
CaseRanges = "X"
Exit Function
End If
CaseRanges = UCase(strkey)
End Function

Function ChangeLang(strkey As String) As String

Const KEYB_RUS As String = "00000419"
Const KEYB_ENG As String = "00000409"
Dim CharsRus As String, CharsEng As String
CharsRus = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
CharsEng = "F<DULT~:PBQRKVYJGHCNEA{WXIO}SM"">Zf,dult`;pbqrkvyjghcnea[wxio]sm'.z"

KeybLayoutName = String(9, 0)
GetKeyboardLayoutName KeybLayoutName

Dim i As Integer
Dim LangRus As Boolean
LangRus = (StrComp(KeybLayoutName, KEYB_RUS, vbTextCompare) = 0)
If LangRus Then
i = InStr(CharsEng, strkey)
Else
i = InStr(CharsRus, strkey)
End If
If i = 0 Then
If LangRus And strkey = "/" Then
ChangeLang = "."
Else
ChangeLang = strkey
End If
Exit Function
End If
If LangRus Then
ChangeLang = Mid(CharsRus, i, 1)
Else
ChangeLang = Mid(CharsEng, i, 1)
End If
End Function

Sub CellEnterFinish(keycode As String)

On Error Resume Next
Dim shift As Boolean
shift = Left(keycode, 1) = "s" ' для поддержки заглавных букв в таких полях, как email, skype и т.п.
If shift Then keycode = Mid(keycode, 2)
strkey = CaseRanges(ChangeLang(Chr(keycode)))
If shift Then strkey = UCase(strkey)
If Not ActiveCell.AllowEdit Then ActiveCell.Next.Activate
ActiveCell.Value = strkey
ActiveCell.Next.Activate
End Sub

Sub HookKeys(Str As String, FuncName As String)

On Error Resume Next
For i = 1 To Len(Str)
s = Mid(Str, i, 1)
If Not IsNumeric(s) Then
Application.OnKey "{" & s & "}", "'" & FuncName & """" & Asc(s) & """'"
If Not InStr("!@#$%^&*()_+~|", s) Then
Application.OnKey "+{" & s & "}", "'" & FuncName & """s" & Asc(s) & """'"
End If
Else
sx = CInt(s) + 96
Application.OnKey s, "'" & FuncName & """" & Asc(s) & """'"
Application.OnKey "{" & sx & "}", "'" & FuncName & """" & Asc(s) & """'"
End If
Next
End Sub

Sub UnHookKeys(Str As String)

On Error Resume Next
For i = 1 To Len(Str)
s = Mid(Str, i, 1)
If Not IsNumeric(s) Then
Application.OnKey "{" & s & "}"
Else
sx = CInt(s) + 96
Application.OnKey s
Application.OnKey "{" & sx & "}"
End If
Next
End Sub

Private Sub RemovePrev()

On Error Resume Next
If ActiveCell.Value <> "" And ActiveCell.Value <> " " Then
ActiveCell.Value = ""
Exit Sub
End If
ActiveCell.Previous.Activate
ActiveCell.Value = ""
End Sub

Private Sub GoToNextField()

Dim next_cell_x As Integer
next_cell_x = ActiveCell.Column + 1
While ActiveCell.Column + 1 = next_cell_x
ActiveCell.Next.Activate
next_cell_x = next_cell_x + 1
Wend
End Sub

Sub НВР_ХРУЩ_ОднаБукваВКаждойЯчейке()

On Error Resume Next
HookKeys HOOKED_KEYS, "CellEnterFinish"
Application.OnKey "{BACKSPACE}", "RemovePrev"
Application.OnKey "{ENTER}", "GoToNextField"
Application.OnKey "~", "GoToNextField"
Application.OnKey "{TAB}"
End Sub

Private Sub Auto_Close()

UnHookKeys HOOKED_KEYS
Application.OnKey "{BACKSPACE}"
Application.OnKey "{ENTER}"
Application.OnKey "~"
End Sub
[/vba]

Автор - A_3485
Дата добавления - 16.08.2012 в 10:43
Hugo Дата: Четверг, 16.08.2012, 10:52 | Сообщение № 23
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Не поленился, глянул в файл - там несколько ошибок:
1. код должен быть в стандартном модуле.
2. Не хватает кода на открытие книги.
3. Автор кода использовал защиту ячеек от редактирования.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНе поленился, глянул в файл - там несколько ошибок:
1. код должен быть в стандартном модуле.
2. Не хватает кода на открытие книги.
3. Автор кода использовал защиту ячеек от редактирования.

Автор - Hugo
Дата добавления - 16.08.2012 в 10:52
A_3485 Дата: Четверг, 16.08.2012, 11:00 | Сообщение № 24
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 146
Репутация: 0 ±
Замечаний: 40% ±

2007
Hugo, Я извиняюсь но я не совсем понял ваши коментарии. С VBA знаком на очень среднем уровне.
1. Как понять что код должен быть в стандартном виде. Вродебы он прописан в своем Листе.
2. Код на отерыти книги, д.б. как я понял чтобы активировалсь процедура Sub НВР_ХРУЩ_ОднаБукваВКаждойЯчейке()
Этот код д.б. в редакторе VBA в ЭтаКнига?. Напишите пожалуйста код?. может такой:
Private Sub Workbook_Open()
НВР_ХРУЩ_ОднаБукваВКаждойЯчейке
end sub

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


Сообщение отредактировал A_3485 - Четверг, 16.08.2012, 11:01
 
Ответить
СообщениеHugo, Я извиняюсь но я не совсем понял ваши коментарии. С VBA знаком на очень среднем уровне.
1. Как понять что код должен быть в стандартном виде. Вродебы он прописан в своем Листе.
2. Код на отерыти книги, д.б. как я понял чтобы активировалсь процедура Sub НВР_ХРУЩ_ОднаБукваВКаждойЯчейке()
Этот код д.б. в редакторе VBA в ЭтаКнига?. Напишите пожалуйста код?. может такой:
Private Sub Workbook_Open()
НВР_ХРУЩ_ОднаБукваВКаждойЯчейке
end sub

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

Автор - A_3485
Дата добавления - 16.08.2012 в 11:00
A_3485 Дата: Четверг, 16.08.2012, 11:11 | Сообщение № 25
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 146
Репутация: 0 ±
Замечаний: 40% ±

2007
В файле прописал:
1. Private Sub Workbook_Open()
НВР_ХРУЩ_ОднаБукваВКаждойЯчейке
end sub

2. Создал Модул1 и перенес весь код из Лист1 в модуль1.
Теперь при открытии файла запускается макрос!

Теперь возник вопрос?
Если клиенту нужно добавать свой e-mail, то нужно учитывать регистр. Как сделать например, чтобы в Range("E15:R15") был учтен регистр?
 
Ответить
СообщениеВ файле прописал:
1. Private Sub Workbook_Open()
НВР_ХРУЩ_ОднаБукваВКаждойЯчейке
end sub

2. Создал Модул1 и перенес весь код из Лист1 в модуль1.
Теперь при открытии файла запускается макрос!

Теперь возник вопрос?
Если клиенту нужно добавать свой e-mail, то нужно учитывать регистр. Как сделать например, чтобы в Range("E15:R15") был учтен регистр?

Автор - A_3485
Дата добавления - 16.08.2012 в 11:11
Hugo Дата: Четверг, 16.08.2012, 11:32 | Сообщение № 26
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Где менять регистр, а где не менять - прописано в коде тут:

[vba]
Code
Function CaseRanges(strkey As String) As String
     If (InRange(ActiveCell, range("A32:AP34"))) Then
         CaseRanges = strkey
         Exit Function
     End If
     If (InRange(ActiveCell, range("38:46, 55:66")) And strkey <> " ") Then
         CaseRanges = "X"
         Exit Function
     End If
     CaseRanges = UCase(strkey)
End Function
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеГде менять регистр, а где не менять - прописано в коде тут:

[vba]
Code
Function CaseRanges(strkey As String) As String
     If (InRange(ActiveCell, range("A32:AP34"))) Then
         CaseRanges = strkey
         Exit Function
     End If
     If (InRange(ActiveCell, range("38:46, 55:66")) And strkey <> " ") Then
         CaseRanges = "X"
         Exit Function
     End If
     CaseRanges = UCase(strkey)
End Function
[/vba]

Автор - Hugo
Дата добавления - 16.08.2012 в 11:32
Serge_007 Дата: Четверг, 16.08.2012, 11:42 | Сообщение № 27
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (A_3485)
Я не понимаю, что значить тэгами?



ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (A_3485)
Я не понимаю, что значить тэгами?


Автор - Serge_007
Дата добавления - 16.08.2012 в 11:42
Hugo Дата: Четверг, 16.08.2012, 11:43 | Сообщение № 28
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Тэги - это понятие из html, означает специальные символы в тексте поста, которые придают тексту нужное визуальное отображение.
Можно их ставить вручную, а можно пользоваться спецкнопками над окном, куда пишите текст.
Сосчитал - их там в первом ряду 17, предпоследняя называется "Код VBA".
Ниже есть ещё 9.
Можно посмотреть все возможные коды по ссылке http://www.excelworld.ru/index/17 (кстати, для кода VBA теперь теги немного другие).


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТэги - это понятие из html, означает специальные символы в тексте поста, которые придают тексту нужное визуальное отображение.
Можно их ставить вручную, а можно пользоваться спецкнопками над окном, куда пишите текст.
Сосчитал - их там в первом ряду 17, предпоследняя называется "Код VBA".
Ниже есть ещё 9.
Можно посмотреть все возможные коды по ссылке http://www.excelworld.ru/index/17 (кстати, для кода VBA теперь теги немного другие).

Автор - Hugo
Дата добавления - 16.08.2012 в 11:43
A_3485 Дата: Четверг, 16.08.2012, 17:46 | Сообщение № 29
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 146
Репутация: 0 ±
Замечаний: 40% ±

2007
Почемуто в коде не проставляется точка "." при пользовании английской раскладкой?. Может кто нибудь знает из за чего?
Спасибо.
 
Ответить
СообщениеПочемуто в коде не проставляется точка "." при пользовании английской раскладкой?. Может кто нибудь знает из за чего?
Спасибо.

Автор - A_3485
Дата добавления - 16.08.2012 в 17:46
Michael_S Дата: Четверг, 16.08.2012, 18:05 | Сообщение № 30
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
В каком коде?
 
Ответить
СообщениеВ каком коде?

Автор - Michael_S
Дата добавления - 16.08.2012 в 18:05
A_3485 Дата: Четверг, 16.08.2012, 18:16 | Сообщение № 31
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 146
Репутация: 0 ±
Замечаний: 40% ±

2007
Ой я уже заработался в том большом, что я выложил в виде тэгов.
И еще возник вопросик, как распечатать Лист1 с помощью двухсторонней печати.

Код:
[vba]
Code
Sub FilePrintDuplex()
ActiveDocument.PrintOut ManualDuplexPrint:=True
End Sub
[/vba] - почемуто не работает.
 
Ответить
СообщениеОй я уже заработался в том большом, что я выложил в виде тэгов.
И еще возник вопросик, как распечатать Лист1 с помощью двухсторонней печати.

Код:
[vba]
Code
Sub FilePrintDuplex()
ActiveDocument.PrintOut ManualDuplexPrint:=True
End Sub
[/vba] - почемуто не работает.

Автор - A_3485
Дата добавления - 16.08.2012 в 18:16
Hugo Дата: Пятница, 17.08.2012, 09:35 | Сообщение № 32
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Вы Эксель с Вордом не перепутали?


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеВы Эксель с Вордом не перепутали?

Автор - Hugo
Дата добавления - 17.08.2012 в 09:35
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!