Каждая буква в отдельной ячейке excel

Каждый символ вводимого слова в отдельной ячейке

Grigoriants

Дата: Среда, 24.01.2018, 16:33 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте! Помогите пожалуйста есть символы к примеру sswq3nVwfB5DR3QD4T77DRay9QBLS. Их я копирую с генератора и нужно вставить в excel чтобы каждый символ был в отдельной ячейке с лева на право как будто я пишу в тетрадку в клеточку.

 

Ответить

Che79

Дата: Среда, 24.01.2018, 16:40 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 1649


Репутация:

306

±

Замечаний:
0% ±


2013 Win, 365 Mac

Grigoriants, в A1 Ваш набор букв, в A2 формулу

Код

=ПСТР($A1;СТОЛБЕЦ(A1);1)

и тяните вправо


Делай нормально и будет нормально!

 

Ответить

Grigoriants

Дата: Среда, 24.01.2018, 17:45 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо большое за ответ. А вы бы не могли объяснить как это сделать но только на другом листе. К примеру на Лист1 я вношу символы а на Лист2 появляется результат.

 

Ответить

Che79

Дата: Среда, 24.01.2018, 17:57 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1649


Репутация:

306

±

Замечаний:
0% ±


2013 Win, 365 Mac

См. файл — в A1 на Листе 1 исходник, в А1:AC1 на Листе 2 результат

К сообщению приложен файл:

987456.xlsx
(9.2 Kb)


Делай нормально и будет нормально!

 

Ответить

Grigoriants

Дата: Среда, 24.01.2018, 18:07 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо большое!!

 

Ответить

  • Первое слово ячейки Excel с большой буквы
  • Вывести первое слово в отдельную ячейку — формула
  • Оставить только первое слово в ячейке
  • Взять первые 2/3/N слов ячейки
  • Процедуры !SEMTools для извлечения первых N слов

Первое слово (до пробела) в Excel-ячейке часто приковывает внимание тех, кто работает с текстовыми данными. Его часто нужно выделить как отдельную единицу, с которой уже определенным образом оперировать — сделать его с заглавной буквы, выделить в отдельную ячейку, оставить только его в исходной ячейке и т.д.

Помимо первого слова ячейки, бывает также важно взять первое слово после него, и так далее.

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

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

Поэтому я рассмотрел эту задачу в отдельной статье “Как сделать первую букву ячейки заглавной“.

Вывести первое слово в отдельную ячейку — формула

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

=ЛЕВСИМВ(A1;ПОИСК(" ";A1&" ")-1)

Здесь A1 – ячейка с искомым словом.

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

Формула для вывода первого слова в отдельную ячейку
Выводим первое слово ячейки в отдельную с помощью комбинации функций ПОИСК и ЛЕВСИМВ

А ошибки нам тут ни к чему, поэтому рекомендуется использовать формулу выше. Удобство формул в том, что, если их протянуть на весь второй столбец, при изменении данных в первом столбце первые слова будут автоматически вставляться в соседние ячейки.

Оставить только первое слово в ячейке

Простейший вариант сделать подобное в Excel – штатной процедурой “Найти и заменить“. Можно вызвать процедуру горячим сочетанием клавиш Ctrl + H, в первом окошке ввести пробел со звёздочкой (см. подстановочные символы в Excel), а второе оставить пустым как есть.

Оставить первое слово в ячейках Excel

Используем “Найти и заменить”, чтобы заменить все слова через пробел после первого, на пустоту.

Есть и вариант с использованием !SEMTools, процедура находится в подразделе ИЗВЛЕЧЬ – Извлечь Слова – по порядку:

оставить в ячейке Excel только первое слово с !SEMTools

“вытаскиваем” первые слова из ячеек и оставляем их в них же, заменяя исходные значения

Взять первые 2/3/N слов ячейки

Чем больше число слов, которые вы хотите извлечь из ячейки, тем сложнее это будет сделать. В Google Spreadsheets есть замечательная функция SPLIT, с её помощью можно разбить ячейку на отдельные слова и брать каждое из них по его индексу, что делает инструмент идеальным для такой задачи. Но в Excel, к сожалению, подобной функции нет.

Однако, есть альтернативы. Например, чтобы взять первые два слова, один из вариантов формулы будет выглядеть так:

=ЛЕВСИМВ(A1;ПОИСК(ЮНИСИМВ(23456);ПОДСТАВИТЬ(A1&" ";" ";ЮНИСИМВ(23456);2))-1)

Формула использует особенные свойства функций ПОДСТАВИТЬ и ЮНИСИМВ:

  • функция ПОДСТАВИТЬ позволяет заменить N-ую подстроку в ячейке на заданное значение
  • а ЮНИСИМВ позволяет задать это значение настолько уникальным, насколько возможно, чтобы быть уверенным, что оно будет единственным в ячейке

Далее функция ПОИСК находит позицию этого символа, чтобы функция ЛЕВСИМВ взяла все что до него (из позиции вычитается единица).

Неплохая надёжная формула со своими преимуществами и недостатками.

Преимущество в том, что легко поддаётся модификации под задачу с извлечением 3,4 и далее слов, просто нужно заменить в формуле аргумент функции подставить, который 2, на соответствующее число.

Недостаток – ЮНИСИМВ работает только в Excel 2013 и старше. Вот аналог для более ранних версий, использующий функцию СИМВОЛ:

=ЛЕВСИМВ(A1;ПОИСК(СИМВОЛ(9);ПОДСТАВИТЬ(A1&" ";" ";СИМВОЛ(9);2))-1)

Функция добавляет в строку символ табуляции, также с высокой вероятностью изначально в ней отсутствующий.

Процедуры !SEMTools для извлечения первых N слов

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

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

взять первые несколько слов ячейки и вывести в другую

Как вытащить первые слова в ячейках в отдельный столбец или оставить в изначальных ячейках с !SEMTools

Хотите так же быстро извлекать слова по их позиции в Excel?
!SEMTools поможет с этой и решит многие другие задачи за пару кликов!

JohnJ

108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

1

Как сделать каждый символ вводимого слова в отдельной ячейке

29.06.2012, 08:47. Показов 8961. Ответов 18

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте! Пишу макрос для Excel, который позволит вписывать только по одной букве в ячейку, переходя после этого на следующую. Удобно для заполнения форм, в которых каждая буква должна быть в своём квадратике. Может быть можно обойтись проще, чем задумал я?
Делал так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub CellEnterFinish(strkey As String)
    ActiveCell.Value = UCase(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)
        Application.OnKey s, "'" & FuncName & """" & s & """'"
    Next
End Sub
 
Sub Макрос1()
'
' Макрос1 Макрос
'
    HookKeys "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя 0123456789-_./QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", "CellEnterFinish"
 
End Sub

И это работает при одном интересном условии: макрос должен запускаться только в русской раскладке. Если он запустится в английской раскладке, то после переключения на русский, буквы в ячейки будут вставляться соответствующие английские. И побороть это я пока не смог. Пробовал проверять раскладку клавиатуры с помощью GetKeyboardLayoutName и, если она меняется, переинициализировать слежение за нажатием клавиши. Переинициализация не помогает…

Прошу помощи.
Win7, Excel 2007



0



Апострофф

Заблокирован

29.06.2012, 13:46

2

Цитата
Сообщение от JohnJ
Посмотреть сообщение

Удобно для заполнения форм, в которых каждая буква должна быть в своём квадратике.

А можно поподробнее — в чем удобство, и как совмещается заполнение полей формы с поячеечным заполнением листа?



0



mc-black

2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

29.06.2012, 18:18

3

Во-первых, поправить надо отслеживаемый символ заключить в {}:

Visual Basic
1
Application.OnKey "{" & s & "}", "'" & FuncName & """" & s & """'"

В этом случае и при русской раскладке будут печататься… латинские буквы. Но будут. Остается для каждой клавиши определять язык раскладки при помощи GetKeyboardLayoutName и в случае русской раскладки менять латинский символ на русский. Пока ничего красивей не придумал. + нет пока реакции на спецсимволы и цифры. Надо ещё почитать документацию, должно быть красивое и простое решение!



1



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

29.06.2012, 18:30

4

Эм-м… а как это вообще может работать? Тут формируются имена вызываемых подпрограмм в виде
‘CellEnterFinish»А»‘
С каких это пор в имени допустимы кавычка и апостроф?

Я бы решил задачу так: по двойному клику на ячейке появляется текстбокс, который обычно спрятан. В него вводишь текст. Можно отслеживать нажатие каждой клавиши и обновлять ячейки, а можно только по Enter распределять буквы по ячейкам и прятать текстбокс обратно.



1



108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

29.06.2012, 18:42

 [ТС]

5

Цитата
Сообщение от Апострофф
Посмотреть сообщение

А можно поподробнее — в чем удобство, и как совмещается заполнение полей формы с поячеечным заполнением листа?

Я имел ввиду печатную форму, а не объект «форма»… Т.е. бланк, в котором каждая ячейка в виде квадратика выделена пунктиром и надо ввести печатными буквами фамилию, имя и прочие данные. Часто в различных организациях такое требуется для заполнения бланка и последующего компьютерного сканирования и распознавания указанных данных.

Добавлено через 8 минут

Цитата
Сообщение от Казанский
Посмотреть сообщение

Эм-м… а как это вообще может работать? Тут формируются имена вызываемых подпрограмм в виде
‘CellEnterFinish»А»‘
С каких это пор в имени допустимы кавычка и апостроф?

Я бы решил задачу так: по двойному клику на ячейке появляется текстбокс, который обычно спрятан. В него вводишь текст. Можно отслеживать нажатие каждой клавиши и обновлять ячейки, а можно только по Enter распределять буквы по ячейкам и прятать текстбокс обратно.

Возможно это решение, но я с ВБА работаю очень редко и с текстбоксами ещё не работал. Думал можно проще. К тому же, пользователь не должен знать, что нужно сделать двойной клик…
Этот фокус с кавычками я с трудом нашёл в интернете, так как функция OnKey не передаёт какая именно клавиша была нажата (она рассчитана на то, что каждому перехватываемому символу будет свой обработчик). А после такого бубна с кавычками перехватываемый символ передаётся в качестве параметра одной общей процедуре на все символы.

По идее вообще ничего сложного: перехватываем нажатие, вставляем символ в ячейку и переходим к следующей. Но сложности возникли именно с тем, что OnKey не распознаёт текущую раскладку, а других способов перехватывать нажатие в ячейке средствами VBA я не знаю. Хотя встречал какую-то API-функцию для установки Hook, но ещё не пробовал… Думается, что это тоже немного уход в дебри…



0



призрак

3261 / 889 / 119

Регистрация: 11.05.2012

Сообщений: 1,702

Записей в блоге: 2

29.06.2012, 20:38

6

а как это будет работать с многострочными текстами?

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

Добавлено через 6 минут

Цитата
Сообщение от JohnJ
Посмотреть сообщение

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

а пользователь будет в состоянии прочитать всплывающее примечание к ячейке с рекомендацией сделать даблклик, а иначе ввод в ячейку запрещен?

Добавлено через 1 минуту
да, и еще один плюс к варианту Казанского: таким способом гораздо легче редактировать текст. и пользователю, и макросу.

Добавлено через 12 минут
ну и, наконец, можно выкидывать текстбокс для ввода/редактирования текста не по даблклику, а по простой смене активной ячейки — тогда и без мыши можно обойтись.
правда, в таком случае случайное выделение любой такой ячейки, приводящее к появлению окошка, через некоторое время может начать раздражать
как вариант — на форме можно сделать непечатаемый радиобатон (триплстейт), с помощью которого управлять режимом появления окошка: даблклик — выделение — никогда.



0



1702 / 189 / 19

Регистрация: 20.11.2011

Сообщений: 281

29.06.2012, 20:43

7

Лучший ответ Сообщение было отмечено как решение

Решение

Цитата
Сообщение от JohnJ
Посмотреть сообщение

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

Делал кому-то, разбирайтесь.



0



JohnJ

108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

29.06.2012, 23:22

 [ТС]

8

Цитата
Сообщение от ikki
Посмотреть сообщение

а как это будет работать с многострочными текстами?

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

Добавлено через 37 секунд
kuklp, спасибо, посмотрю. Вы, я вижу, через создание текстового поля делали…

Добавлено через 2 часа 16 минут

Цитата
Сообщение от mc-black
Посмотреть сообщение

Во-первых, поправить надо отслеживаемый символ заключить в {}:

Visual Basic
1
Application.OnKey "{" & s & "}", "'" & FuncName & """" & s & """'"

В этом случае и при русской раскладке будут печататься… латинские буквы. Но будут. Остается для каждой клавиши определять язык раскладки при помощи GetKeyboardLayoutName и в случае русской раскладки менять латинский символ на русский. Пока ничего красивей не придумал. + нет пока реакции на спецсимволы и цифры. Надо ещё почитать документацию, должно быть красивое и простое решение!

Вот как раз после добавления фигурных скобок цифры перестают реагировать
Я решил сделать по-вашему. Вот что у меня получилось. Если кто-то сможет подсказать как улучшить код, то с радостью приму советы (а за одно полезно будет протестировать на разных компах и системах )

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Dim KeybLayoutName As String
 
Sub CellEnterFinish(strkey As String)
    ActiveCell.Value = UCase(ChangeLang(strkey))
    ActiveCell.Next.Activate
End Sub
 
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
        ChangeLang = strkey
        Exit Function
    End If
    If LangRus Then
        ChangeLang = Mid(CharsRus, i, 1)
    Else
        ChangeLang = Mid(CharsEng, i, 1)
    End If
End Function
 
Sub HookKeys(Str As String, FuncName As String)
    On Error Resume Next
    For i = 1 To Len(Str)
        s = Mid(Str, i, 1)
        Application.OnKey s, "'" & FuncName & """" & s & """'"
    Next
End Sub
 
Sub Макрос1()
Attribute Макрос1.VB_ProcData.VB_Invoke_Func = " n14"
'
' Макрос1 Макрос
'
    HookKeys "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя 0123456789-_./QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", "CellEnterFinish"
 
End Sub

Добавлено через 6 минут
Цифры на дополнительной клавиатуре не работают



0



1300 / 402 / 22

Регистрация: 21.10.2011

Сообщений: 1,285

02.07.2012, 12:16

9

JohnJ,
выложите книгу Excel, с которой вы работаете, и поясните, что надо сделать.

Примечание:
всю книгу не выкладывайте, а оставьте в книге столько данных, сколько необходимо, чтобы понять вашу ситуацию.



0



JohnJ

108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

02.07.2012, 12:35

 [ТС]

10

Всем спасибо за помощь, я сделал. Если кому интересно, то вот как получилось (может кому-то пригодится, так как готового подобного скрипта я не нашёл, были только основанные на использовании textbox и т.п.):
Автозапуск

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Workbook_Open()
    НВР_ХРУЩ_ОднаБукваВКаждойЯчейке
    If range("F76").Value = "" Or range("F76").Value = " " Then
        range("F76").Value = Mid(Date, 1, 1)
        range("G76").Value = Mid(Date, 2, 1)
        range("I76").Value = Mid(Date, 4, 1)
        range("J76").Value = Mid(Date, 5, 1)
        range("L76").Value = Mid(Date, 7, 1)
        range("M76").Value = Mid(Date, 8, 1)
        range("N76").Value = Mid(Date, 9, 1)
        range("O76").Value = Mid(Date, 10, 1)
    End If
    range("L3").Activate
End Sub

Сам модуль макроса

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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@-_/"
 
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
        ChangeLang = strkey
        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 Integer)
'    On Error Resume Next
    strkey = CaseRanges(ChangeLang(Chr(keycode)))
    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) & """'"
        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
 
Sub НВР_ХРУЩ_ОднаБукваВКаждойЯчейке()
'    On Error Resume Next
    HookKeys HOOKED_KEYS, "CellEnterFinish"
    Application.OnKey "{BACKSPACE}", "RemovePrev"
    Application.OnKey "{TAB}"
End Sub
 
Private Sub Auto_Close()
    UnHookKeys HOOKED_KEYS
    Application.OnKey "{BACKSPACE}"
End Sub

Так же прилагаю книгу для просмотра результата, но она зашифрована паролем. Впрочем, читал что для профи нет сложностей расшифровать. Не знаю, не пробовал сам, в данном случае мне это не суть важно.

Вложения

Тип файла: xls anketa_macros.xls (81.0 Кб, 101 просмотров)



0



2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

02.07.2012, 13:24

11

Потестирвал форму. Сделано хорошо, выглядит очень аккуратно и продуманно. Поле для e-mail можно чуть длинней. Нельзя нажать точку в русской раскладке (вставляется слэш). Нажатие Shift + буква приводит к необработке символа (неплохо бы предусмотеть, чтобы и Shift по привычке можно бы было набирать. Для этого надо добавить ассециаций Shift+Буква. Название партии повеселило — это серьезно или в шутку?



1



108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

02.07.2012, 13:32

 [ТС]

12

Саму форму разрабатывал не я. Название партии — это правда Благодарю за указания на недоработки и ошибки. Постараюсь сегодня исправить.
А где может понадобиться поставить точку в русской раскладке?



0



2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

02.07.2012, 13:42

13

Цитата
Сообщение от JohnJ
Посмотреть сообщение

А где может понадобиться поставить точку в русской раскладке?

В паспортных данных, в поле «зарегистрирован» — наименование органа внутренних дел. С точкой в e-mail нет проблем.



0



JohnJ

108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

02.07.2012, 14:14

 [ТС]

14

Исправил замечания: теперь можно использовал символ «точка» на русской раскладке, плюс эффект теперь распространяется на буквы, введённые с шифтом.
В коде изменения следующие:
Строки 27 и 28 теперь выглядят так:

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

После 65-ой строки вставлена похожая:

Visual Basic
1
Application.OnKey "+{" & s & "}", "'" & FuncName & """" & Asc(s) & """'"

Вложения

Тип файла: xls anketa_macros.xls (80.0 Кб, 29 просмотров)



0



108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

02.07.2012, 14:43

 [ТС]

15

В общем, на моё предыдущее сообщение не смотрите. Если так сделать, то всё испортится.
Нужно сделать несколько хитрее.
Вот теперь я сделал и протестировал.
Ещё вопрос появился. Возможно его лучше задать в отдельной теме, но попробую здесь:
Как лучше реализовать такую задумку: по нажатию на Enter Курсор должен занимать начальную позицию следующей строки для ввода. Можно, конечно, идти в цикле до следующей ячейки, пока не окажемся на отличной от следующей справа… Но может есть способ покрасивше?



0



1300 / 402 / 22

Регистрация: 21.10.2011

Сообщений: 1,285

02.07.2012, 17:55

16

JohnJ,
выложите книгу Excel и поясните, что хотите сделать.



0



mc-black

2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

02.07.2012, 18:29

17

Цитата
Сообщение от JohnJ
Посмотреть сообщение

Как лучше реализовать такую задумку: по нажатию на Enter Курсор должен занимать начальную позицию следующей строки для ввода. Можно, конечно, идти в цикле до следующей ячейки, пока не окажемся на отличной от следующей справа… Но может есть способ покрасивше?

Для такой небольшой формочки подойдет и перебор в цикле, не критично, вот например

Visual Basic
1
2
3
4
5
6
7
Private Sub NextLine()
    Dim i As Long
    i = ActiveCell.Row
    Do While ActiveCell.Row = i
        ActiveCell.Next.Select
    Loop
End Sub

По поводу «покрасивше», в этом коде, несмотря на то, что он рабочий, мне не нравится 2 вещи: отсутствие Option Explicit и объявление переменных где попало. Обычно локальные переменные объявляются строго в начале процедуры, раньше первой исполняемой строчки. Так легче читать код и проще его поддерживать.



1



JohnJ

108 / 7 / 3

Регистрация: 29.06.2012

Сообщений: 28

02.07.2012, 22:01

 [ТС]

18

Лучший ответ Сообщение было отмечено как решение

Решение

mc-black, так как у меня на одной строке может быть несколько полей для ввода (например, строка 7), то реализовал переход немного по-другому. На счёт Option Explicit запомню, в следующий раз обязательно постараюсь его включить. В данном случае я узнал об этой директиве(?) в процессе написания скрипта, думая, по-началу, что код будет гораздо меньше и проще в итоге. И решил его не использовать…
Выкладываю окончательный вариант, а то в прошлый раз неработоспособный выложил…

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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@-_/"
 
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

Busine2012
Я выложил книгу, но исключительно для того, чтобы другие люди могли протестировать и посмотреть результат работы кода, представленного выше. На случай, если кому-то это понадобится. Вопросов на данный момент у меня не осталось.

Вложения

Тип файла: xls anketa_macros.xls (81.0 Кб, 96 просмотров)



2



0 / 0 / 0

Регистрация: 02.07.2013

Сообщений: 2

02.07.2013, 14:56

19

Добрый день!
Макросами не занимался с универа, а тут приспичило по работе))) Нужно все тоже самое, что и у Вас, но проще, а именно: автопереход из одной ячейки в другую на не заблокированной области и применить это все ко всем листам книги. Попробовал Ваш макрос, все работает, но только на первом листе, на остальные не распространяется. Также, мне не нужно прописывать крестики в ячейки, достаточно возможности ставить любую букву в любую не заблокированную ячейку.
Крестики в ячейки я уже убрал, теперь нужно применение ко все листам документа и как быть с диапазоном, почему-то, на первом листе в ячейку S19 не получается ввести значение, но она не блокировалась, не нашел у вас в коде явных указаний на нее. Если не затруднит, пожалуйста, помогите советом.

Добавлено через 3 часа 24 минуты
Подскажите правильно, как записать применение макроса ко всем листам документа и где в коде (выше/ниже) это расположить в коде.
Нашел пример с помощью ws:

Set WS1 = ActiveSheet активный лист
Set WS2 = ActiveWorkbook.Sheets(‘Лист1’) — нужный лист
WS2.Cells(1,1).value=WS2.Cells(1,1).value
WS2.Activate — нужный стал активным

было бы даже достаточно, если бы макрос начинал работать на том листе, на котором я сейчас нахожусь, т.е. активном листе. Я так понял, тут написано, что ws1 активный лист, а ws2 лист который нам нужен и нажимая на него (в первую ячейку или «вообще» на него?) он становится активным.



0



В статье рассказывается, как настроить подстановку данных в документы сложной структуры
(где каждая буква — в отдельной клетке), при помощи программы заполнения документов.

Выглядят заполняемые документы примерно так: (щелкните на картинке для увеличения)

Заявление на регистрацию ККМ

Наша задача — настроить этот шаблон так, чтобы программа заполнения документов подставляла в него текстовые данные,
а шаблон сам, при помощи формул, распределял вставленный текст по отдельным ячейкам.

Самый простой, на мой взгляд, способ добиться желаемого, — подставлять данные в «невидимые» ячейки,
а потом, при помощи формулы =ПСТР(), подтягивать отдельные буквы нужные ячейки.

(для ручной вставки текста в подобные бланки есть специальный макрос, но в нашем случае он не подойдёт)

Сделать ячейку «невидимой» —  очень просто. Для этого достаточно назначить шрифту ячейки белый цвет.

А формулы будут иметь такой вид:

=ПСТР(АдресНевидимойЯчейки;1;1)
=ПСТР(АдресНевидимойЯчейки;2;1)
=ПСТР(АдресНевидимойЯчейки;3;1)
и т.д.

На следующем скриншоте показано, как это сделано: (щелкните на картинке для увеличения)

Теперь осталось выбрать место для «невидимой» ячейки, вписать в неё код поля (например, {улица}),
и проставить формулы во все ячейки-клеточки.

Делать это вручную — достаточно долго, да и легко ошибиться при вводе формул.

Для автоматизации настройки подобных шаблонов, в программе заполнения документов имеется специальная опция (см. скриншот)

Включив опцию «Вставлять формулы для разбивки текста по буквам»,
вам станет доступен макрос, который при нажатии Ctrl + Shift + V

  1. возьмёт текст из буфера обмена Windows (предполагается, что перед этим вы скопировали код поля в исходной таблице)
  2. вставит этот текст в ПЕРВУЮ из выделенных ячеек, назначив этой ячейке белый цвет шрифта
  3. пропишет формулы =ПСТР() с нужными параметрами, СО ВТОРОЙ ДО ПОСЛЕДНЕЙ выделенной ячейки

Как это работает — можно посмотреть в видеоинструкции:

<видео будет добавлено чуть позже>

  • 24536 просмотров

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

док разбить слово на буквы 1


стрелка синий правый пузырь Разделить слово или число на отдельные ячейки с помощью формулы

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

1. В пустой ячейке рядом с вашими данными, например C1, введите эту формулу = MID ($ A1; COLUMNS ($ A $ 1: A $ 1); 1), см. снимок экрана:

док разбить слово на буквы 2

2. Затем перетащите маркер заполнения в правые ячейки, пока не отобразятся пустые ячейки, а содержимое ячейки A1 не будет разделено на отдельные ячейки.

док разбить слово на буквы 3

3. Затем, продолжая перетаскивать дескриптор заполнения вниз, в диапазон, в котором вы хотите применить эту формулу, и все данные в столбце A будут разделены по разным ячейкам по вашему желанию. Смотрите скриншот:

док разбить слово на буквы 4


стрелка синий правый пузырь Разделить слово или число на отдельные ячейки с кодом VBA

Если вас интересует код VBA, следующий код также может оказать вам услугу.

1. Удерживайте ALT + F11 ключи в Excel, чтобы открыть Окно Microsoft Visual Basic для приложений.

2. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.

Код VBA: разделить слово на отдельные ячейки

Sub SplitStuff()
'Updateby Extendoffice
Dim Rng As Range
Dim InputRng As Range, OutRng As Range
xTitleId = "KutoolsforExcel"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
Application.ScreenUpdating = False
For Each Rng In InputRng
    xValue = Rng.Value
    xRow = Rng.Row
    For i = 1 To VBA.Len(xValue)
        OutRng.Cells(xRow, i).Value = VBA.Mid(xValue, i, 1)
    Next
Next
Application.ScreenUpdating = True
End Sub

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

док разбить слово на буквы 5

4. Нажмите OK, и появится другое окно с подсказкой, в котором вам будет предложено выбрать ячейку для поиска результата.

док разбить слово на буквы 6

5. Затем нажмите OK, а слова или числа в выбранных ячейках были разделены на отдельные символы. Смотрите скриншот:

док разбить слово на буквы 7


стрелка синий правый пузырь Разбить слово или число на отдельные ячейки с помощью Kutools for Excel

Kutools for ExcelАвтора Разделить клетки feature — мощный инструмент, который может помочь вам разделить содержимое ячейки на отдельные столбцы или строки с определенными разделителями, в то же время он также может разделить текст и число на два столбца.

После установки kutools for Excel, пожалуйста, сделайте следующее:

1. Выделите ячейки, которые хотите разделить.

2. Затем нажмите Кутулс > Слияние и разделение > Разделить клетки, см. снимок экрана:

3. В Разделить клетки диалоговое окно, выберите Разделить на столбцы под Тип, затем проверьте Укажите ширину под Разделить на раздел и введите номер 1 в текстовое поле, что означает разделение слова на отдельные ячейки по каждому символу. Смотрите скриншот:

док разбить слово на буквы 9

4. Затем нажмите Ok При нажатии кнопки появляется другое окно подсказки, напоминающее о выборе ячейки для вывода результата, см. снимок экрана:

док разбить слово на буквы 10

5, Затем нажмите OK, содержимое выделенной ячейки разделено на отдельные символы. Смотрите скриншот:

док разбить слово на буквы 11

 Скачать и бесплатную пробную версию Kutools for Excel от Yhao сейчас!


стрелка синий правый пузырь Разбить слово или число на отдельные ячейки с помощью Kutools for Excel


стрелка синий правый пузырь Объединяйте отдельные буквы или цифры в одно слово или цифру

Объединяйте отдельные буквы или цифры в одно слово или цифру

Если вы хотите объединить эти отдельные буквы ячеек в одно слово в отличие от вышеуказанных методов, Kutools for Excel‘s Сочетать утилита может помочь вам объединить их в одну ячейку так быстро, как вы можете.

док разбить слово на буквы 12


Статьи по теме:

Как извлечь первое / последнее / n-е слово из текстовой строки в Excel?

Как извлечь первую букву каждого слова из ячейки?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Понравилась статья? Поделить с друзьями:
  • Кадровые документы в excel
  • Кадровое делопроизводство в excel
  • Кавычки елочки как поставить excel
  • Кавычки в формуле excel сцепить
  • Кавычки в формуле excel если