VBA в Excel

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Помогите разобраться с таким вопросом.

В VBA вообще ни бум-бум. Так что вопрос простой.

Есть текст в ячейке таблицы. По Alt+Enter я могу его разбить на несколько строк в пределах одной ячейки. Как это сделать средствами VBA? То есть какой макрос надо написать, чтобы в большой таблице преобразовать однотипные ячейки.

Например, у меня есть столбец ФИО - там данные расположены в строчку таким образом:
фамилия_имя_отчество.

Надо, чтобы было в столбец так:
фамилия
имя
отчество
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Просто вставь перевод строки.
Например:
Dim sh As Excel.Worksheet
Set sh = ActiveSheet
sh.Cells(1, 1) = "qwe" & Chr(10) & "asd"

В ячейке будет:
qwe
asd
 

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
ploki said:
Просто вставь перевод строки.
Например:
Dim sh As Excel.Worksheet
Set sh = ActiveSheet
sh.Cells(1, 1) = "qwe" & Chr(10) & "asd"

В ячейке будет:
qwe
asd

Спасибо, но как же именно разбить строку, которая уже есть в этой ячейке? Как выглядит функция замены подстроки в строке (которая, например, все пробелы в строке заменит переводами строки)?
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Replace(expression, find, replace[, start[, count[, compare]]])

Например:
Dim sh As Excel.Worksheet
Dim st As String

Set sh = ActiveSheet
st = sh.Cells(1, 1)
st = Replace(st, " ", Chr(10))
sh.Cells(1, 1) = st
 
Last edited by a moderator:

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Спасибо ploki!

Я уже нашел эту функцию и вставил ее в рабочую книгу Excel таким образом:

Dim sh As Excel.Worksheet
Set sh = ActiveSheet

For nCounter = 1 To ПоследняяСтрока Step 1
sh.Cells(nCounter, 2) = Replace(sh.Cells(nCounter, 1), " ", Chr(10))
Next


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

ffantasm

Member
Joined
Jun 23, 2004
Messages
6
Reaction score
1
В VВА есть стандартная функция SPLIT("исходная строка","разделитель")
получишь массивю Выглядит это так.
txt="Привет с большого бадуна"
str=split(txt," ")
получаешь массив str(), где:
str(0)="Привет"
str(1)="с"
str(2)="большого"
str(3)="бадуна"
Чтобы объеденить -> функ. JOIN - синтаксис такой же.
 

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
ffantasm said:
В VВА есть стандартная функция SPLIT("исходная строка","разделитель")
Чтобы объеденить -> функ. JOIN - синтаксис такой же.

Спасибо за полезную информацию, ffantasm! Если бы знал это месяц назад, то не было бы проблем с решением другой проблемы по формированию простенькой БД в txt формате :) Сейчас задачи изменились и мне проще использовать xml.
 
Last edited by a moderator:

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Такой вопрос :
Есть ли в VBA для Excel такая штука как выполнения макроса при закрытии и открытии книги .

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

Такой фишки как workbook.oncreate workbook.onopen workbook.onclose не нашел :((
 

Ognev

ex-Team DUMPz
Joined
Aug 20, 2018
Messages
2,103
Reaction score
902
Private Sub Workbook_Open()
===Текст макроса.===
End Sub
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Добавил макрос в модуль пустой книги, открываю , закрываю книгу ничего не происходит, макрос не срабатывает.
Тестовый макро такой

Private Sub Workbook_Open()
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = "Do you want to continue ?" ' Define message.
Style = vbYesNo + vbCritical + vbDefaultButton2 ' Define buttons.
Title = "MsgBox Demonstration" ' Define title.
Help = "DEMO.HLP" ' Define Help file.
Ctxt = 1000 ' Define topic
' context.
' Display message.
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then ' User chose Yes.
MyString = "Yes" ' Perform some action.
Else ' User chose No.
MyString = "No" ' Perform some action.
End If
End Sub
 

Ognev

ex-Team DUMPz
Joined
Aug 20, 2018
Messages
2,103
Reaction score
902
Возможно, отключены макросы.
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Да нет. Макросы включены сто процентов... Блин таки нет решения... Жаль
 

Ognev

ex-Team DUMPz
Joined
Aug 20, 2018
Messages
2,103
Reaction score
902
Ну а пошаговое выполнение что дает? Может в самом макросе чушь написана )))
 

Wern

Member
Joined
Jan 10, 2007
Messages
21
Reaction score
2
Процедура где находится? в модуле объекта книга
Microsoft Excel objects/ThisWorkbook(ЭтаКнига)?
или в модулях книги?
Modules/Module1?
Должна быть в модуле объекта
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Сработало ! Не туда засунул , спасибо аграменнейшее!
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Кстати в ту же тему кому надо
выполнение макросов перед закрытием
Private Sub Workbook_BeforeClose(Cancel as Boolean)
End sub
 

Wern

Member
Joined
Jan 10, 2007
Messages
21
Reaction score
2
В справке по VBA можно все найти.
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
Может кто сталкивался, я просто замучался уже.
Делаю импорт таблицы с курсами из инета, но там все данные с точкой,
к примеру
5.05
6.35
0.19
и т.д.

Когда заменяю в таблице руками через CTRL + H - то точка на запятую меняется нормально - когда пробую через макрос, который записывается при этих действиях получается полная белиберда
5,05
65 352,00
99 251,00
0,1901
34 006,00
17 462,00
0,4651
13 466,00


то есть он мне меняет знак и курс превращается в космическую цифру.

текст макроса такой
Columns("F:F").Select
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
Кто нибудь может сказать что я делаю не так ?
 

S.F.W.

Reverse Engineer
Joined
Apr 16, 2020
Messages
184
Reaction score
116
вообщем решил через задницу лишним столбцом
=ЗАМЕНИТЬ(RC[-5];НАЙТИ(".";RC[-5];1);1;",")
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Для точного ответа на вопрос "Что не так?" информации не достаточно.
Но несколько соображений:
1. Надо посмотреть формат ячеек этого столбца и General или Number поменять на Text. Только потом делать замены.

2. Для вставки крупных кусков данных лучше использовать мастер импорта внешних данных (Data -> From Web или сначала сохранить в .txt, а потом Data -> From Text).

3. Если уж использовать VBA, то там есть прекрасная функция Replace: Function Replace(Expression As String, Find As String, Replace As String, [Start As Long = 1], [Count As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) As String. Применять лучше к каждой ячейке выделения через промежуточную переменную типа String.
 
Last edited by a moderator:
Top