VBA в Excel

vitaly3000

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

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

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

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

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

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Просто вставь перевод строки.
Например:
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
Location
Красноярск
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
Location
Москва
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
Location
Красноярск
Спасибо 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
Age
54
В 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
Location
Красноярск
ffantasm said:
В VВА есть стандартная функция SPLIT("исходная строка","разделитель")
Чтобы объеденить -> функ. JOIN - синтаксис такой же.

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

S.F.W.

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

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

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

Ognev

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

S.F.W.

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

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,104
Reaction score
902
Age
25
Возможно, отключены макросы.
 

Ognev

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

Wern

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

S.F.W.

Member
Joined
Apr 16, 2004
Messages
184
Reaction score
116
Age
49
Location
Екатеринбург
Кстати в ту же тему кому надо
выполнение макросов перед закрытием
Private Sub Workbook_BeforeClose(Cancel as Boolean)
End sub
 

S.F.W.

Member
Joined
Apr 16, 2004
Messages
184
Reaction score
116
Age
49
Location
Екатеринбург
Может кто сталкивался, я просто замучался уже.
Делаю импорт таблицы с курсами из инета, но там все данные с точкой,
к примеру
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
Кто нибудь может сказать что я делаю не так ?
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Для точного ответа на вопрос "Что не так?" информации не достаточно.
Но несколько соображений:
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