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

» Excel VBA

Автор: ScorpionS
Дата сообщения: 12.08.2006 17:26
Копирую в буфер таблицу на html-странице (один столбец - цифры).
Когда вставляю в Excel текст из буфера (Правка -> Вставить), то цифры распознается нормально и имеют вид 186 588.00, т.е. их формат такой # ##0.00. А когда я создаю элемент управления (кнопку) и записываю ему простой код

Код: Range("A4").Select
ActiveSheet.Paste
Автор: Yuk
Дата сообщения: 12.08.2006 17:47
ScorpionS
пример html страницы можно?
Автор: ScorpionS
Дата сообщения: 12.08.2006 18:16
Дружище, с удовольствием, но туда доступ по закрытой подписке. Думаю, ты туда попасть наврядли сможешь. Я отправил сохраненную страничку тебе по почте.
Автор: Yuk
Дата сообщения: 12.08.2006 18:48
ScorpionS
У меня и обычной вставкой не получается.
Предлагаю вставить в макрос:
Код: For Each c In ActiveSheet.UsedRange
If IsNumeric(Replace(c.Value, " ", "")) Then
c.Value = Replace(c.Value, " ", "")
End If
Next
Автор: ScorpionS
Дата сообщения: 12.08.2006 19:16
Yuk
Спасибо за совет!
Автор: urodec
Дата сообщения: 16.08.2006 10:55
У меня такой вопрос - как программно задать ширину столбца в см?
Автор: RedPromo
Дата сообщения: 16.08.2006 12:51
urodec
А вот так

Цитата:

Worksheets("Лист1").Columns("A:A").ColumnWidth = 18.00
или
Columns("A:A").ColumnWidth = 18.00

Автор: urodec
Дата сообщения: 16.08.2006 13:19
RedPromo
Вы уверены, что это в СМ? Мне нужно именно в см

Добавлено:
Нашел...
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213422
Не всего лишь-то ))

Цитата:
Sub ColumnWidthInCentimeters()

Dim cm As Single, points As Integer, savewidth As Integer
Dim lowerwidth As Integer, upwidth As Integer, curwidth As Integer
Dim Count As Integer

' Turn screen updating off.
Application.ScreenUpdating = False
' Ask for the width in inches wanted.
cm = Application.InputBox("Enter Column Width in Centimeters", _
"Column Width (cm)", Type:=1)
' If cancel button for the input box was pressed, exit procedure.
If cm = False Then Exit Sub
' Convert the inches entered to points.
points = Application.CentimetersToPoints(cm)
' Save the current column width setting.
savewidth = ActiveCell.ColumnWidth
' Set the column width to the maximum allowed.
ActiveCell.ColumnWidth = 255
' If the points desired is greater than the points for 255
' characters...
If points > ActiveCell.Width Then
' Display a message box because the size specified is too
' large and give the maximum allowed value.
MsgBox "Width of " & cm & " is too large." & Chr(10) & _
"The maximum value is " & _
Format(ActiveCell.Width / 28.3464566929134, _
"0.00"), vbOKOnly + vbExclamation, "Width Error"
' Reset the column width back to the original.
ActiveCell.ColumnWidth = savewidth
' Exit the Sub.
Exit Sub
End If
' Set the lowerwidth and upper width variables.
lowerwidth = 0
upwidth = 255
' Set the column width to the middle of the allowed character
' range.
ActiveCell.ColumnWidth = 127.5
curwidth = ActiveCell.ColumnWidth
' Set the count to 0 so if it can't find an exact match it won't
' go on indefinitely.
Count = 0
' Loop as long as the cell width in is different from width
' wanted and the count (iterations) of the loop is less than 20.
While (ActiveCell.Width <> points) And (Count < 20)
' If active cell width is less than desired cell width.
If ActiveCell.Width < points Then
' Reset lower width to current width.
lowerwidth = curwidth
' set current column width to the midpoint of curwidth
' and upwidth.
Selection.ColumnWidth = (curwidth + upwidth) / 2
' If active cell width is greater than desired cell width.
Else
' Set upwidth to the curwidth.
upwidth = curwidth
' Set column width to the mid point of curwidth and lower
' width.
Selection.ColumnWidth = (curwidth + lowerwidth) / 2
End If
' Set curwidth to the width of the column now.
curwidth = ActiveCell.ColumnWidth
' Increment the count counter.
Count = Count + 1
Wend
End Sub

Автор: IP
Дата сообщения: 17.08.2006 14:08
Помогите ПЛЫЗЗЗ!!! Скриптиком для VBA
Который из закрытого файла (ИСТОЧНИК) с названием OUTPUT1 из его ячейки А1, импортирetn СОДЕРЖАНИЕ (Текст) в новую книгу (ПРИЕМНИК) с названием INPUT - В НАЗВАНИЕ ЯРЛЫКА ЛИСТА, там где по умолчанию "Лист1, Лист2 и т.д .

Чтобы по названию ярлыка у листа файла (ПРИЕМНИКа) было видно какой импорт получен

Таких импортов мне нужно 3-10 из разных файлов OUTPUT1, OUTPUT2, OUTPUT3, в разные листы , т.е. я должен получить разные названия ярлыков в файле (ПРИЕМНИКе) INPUT, которые соответствуют Содержанию Ячеек, например А1, в файлах (ИСТОЧНИКах) OUTPUT1, OUTPUT2, OUTPUT3 ...

Автор: Dr Eam
Дата сообщения: 17.08.2006 15:39
Какой-то непонятный баг у меня.
Макрос выполняет копирование некоторых данных с одного листа на другие, а также несложные расчеты.
Также я пытаюсь выполнять форматирование ячеек. И здесь возникают проблемы.
Пока есть 2 типа форматирования - строки типа

Цитата:
Worksheets("Накладная").Range(Cells(18, 1), Cells(17 + rows, 1)).HorizontalAlignment = xlLeft

и строки типа

Цитата:
Worksheets("Накладная").Range(Cells(18, 4), Cells(17 + rows, 5)).NumberFormat = "0.00"

Они вызывают runtime error 1004 (Application-defined or object-defined error).
Я пытаюсь просмотреть код отладчиком, разбираюсь, заускаю многократно, комментирую эти строки, снова возвращаю. И вдруг в определенный момент всё начинает работать без ошибок! Но стоит только внести какие-то небольшие изменения в код (добавить любую строчку кода, например, даже безобидного, типа SumTotal = 0, как снова всё вываливается на таких ошибках, и снова надо производить непонятные танцы с бубнов в отладчике, ничего, по сути, не меняя.
В чём дело? Меня подобные ошибки всегда достают. Помню, borland c++ 3.5 полон был похожих багов...
Автор: Yuk
Дата сообщения: 17.08.2006 16:57
IP
[more=Примерно так]
Код: Sub GetName()
Dim fPath As String
Dim fName As String
Dim sName As String
Dim cRange As String
Dim aSheet As Worksheet
Dim tSheet As Worksheet

fPath = "C:\temp" 'no last \
fName = "file.xls"
sName = "Sheet1"
cRange = "A1" 'one cell only, no check

Set aSheet = ActiveSheet
Set tSheet = ActiveWorkbook.Worksheets.Add 'temporary sheet

tSheet.Range(cRange).Formula = _
"='" & fPath & "\[" & fName & "]" & _
sName & "'!" & cRange
aSheet.Name = CStr(tSheet.Range(cRange).Value)

Application.DisplayAlerts = False
tSheet.Delete
Application.DisplayAlerts = True
aSheet.Activate
End Sub
Автор: RedPromo
Дата сообщения: 17.08.2006 17:15
IP
Вот так можно

Цитата:

Dim Wb As Workbook
Dim NewWb As Workbook
Dim NewShet As Worksheet
Dim StrFileName As String

Set NewWb = Application.Workbooks.Add 'Создаем новую книгу

For i = 2 To 4
StrFileName = "D:\Document\Книга" & i & ".xls" 'Формируем имя єкспортируемого файла
Set Wb = Application.Workbooks.Open(StrFileName) 'Откріваем файло
Set NewShet = NewWb.Worksheets.Add 'Добавляем лист в нашу книгу
NewShet.Name = Wb.Worksheets(1).Cells(1, 1).Value 'Устанавливаем название листа тип как Лист1, Лист1 из первой ячейки первого листа
Wb.Close 'Ну и закрываем на лист экспорта
Next



urodec
А че сложного зачем тебе вся процедура
вот то что тебе нужно

Цитата:

Worksheets("Лист1").Columns("A:A").ColumnWidth = Application.CentimetersToPoints(cm)

И все.

Автор: Yuk
Дата сообщения: 17.08.2006 17:21
Dr Eam
Не пробовал прописать Workbooks перед Worksheets.
Автор: Dr Eam
Дата сообщения: 18.08.2006 11:57
Yuk
Не помогает.
Автор: Anton T
Дата сообщения: 18.08.2006 12:46
Как можно добавить новый лист с названием бувкой от А до Я.
Если в листе с буквой, например, Б - не существует, то лист создает её Б:
Я знаю, он выглядить так:

Код:
Set NewSheet = Worksheets.Add
NewSheet.Name = TextBox1.Text 'текстбокс для ввода буквы
Автор: Yuk
Дата сообщения: 18.08.2006 15:43
Dr Eam
На разных компах пробовал?
Можешь упростить код до такого состояния, когда ошибка еще появляется и показать здесь?

Anton T

Determine if a sheet exists

Автор: filmax
Дата сообщения: 18.08.2006 15:48
Как в макросе задать печатать с двух сторон.

Принтер(и ксерокс, и сканер) Минолта это делать умеет.
Приходится выбирать вручную double-sided, а потом возвращать обратно - single-sided

Задача:
один лист книги (ЗАЯВКА, 1 экз.) односторонний,
другой лист книги (АКТ, и три экз.) двухсторонний.

Одну бы кнопочку бы сделать бы, и все было бы окей!

ася 827527
Автор: Yuk
Дата сообщения: 18.08.2006 16:30
filmax
Печать из макроса делается методом PrintOut.
Но параметра для дуплексной печати там нет. Все это свойства драйвера принтера, про которые эксель не знает. Можно делать через за.. SendKeys метод. Возможно есть Windows API. Разбираться не хочется.

В принципе, установить дуплексную печать нужно только один раз за сеанс работы. Или установить по умолчанию. Можно создать отдельный принтер с дуплексной печатью по умолчанию.
Автор: Anton T
Дата сообщения: 19.08.2006 12:32
Yuk
Спасибо! Ты замечательный человек!
Автор: Yuk
Дата сообщения: 19.08.2006 18:01
Anton T
О-о-о! Я польщен!
Автор: Anton T
Дата сообщения: 21.08.2006 12:51
Yuk
Привет земляк!(Попасная )
Как можно сделать поля со списком с помощью "фильтр"
Например, в столбце А, Б и В, сооветственно, Фамилия, Имя и Отечество:
Бондаренко Анатолий Васильевич
Бондаренко Нина Васильевна
Бондарчук Николай Николаевич
Бондарчук Анна Николаевна

Когда я вводу в поле "Бондар", а оно должно быть отображена:
Бондаренко
Бондарчук

Вот примеры без фильтра:

Код:
Private Sub UserForm_Initialize()
Dim ColCnt As Integer
Dim rng As Range
Dim cw As String
Dim c As Integer

ColCnt = ActiveSheet.UsedRange.Columns.Count
Set rng = ActiveSheet.UsedRange
With ComboBox1
.ColumnCount = ColCnt
.RowSource = rng.Address
cw = ""
For c = 1 To .ColumnCount
cw = cw & rng.Columns(c).Width & ";"
Next c
.ColumnWidths = cw
.ListIndex = 0
End With
End Sub
Автор: Yuk
Дата сообщения: 21.08.2006 22:21
Anton T

Цитата:
Попасная



Цитата:
Как можно цвет фона текстбокса при нажатия курсора?


Код: Private Sub TextBox1_Enter()
TextBox1.BackColor = RGB(255, 255, 0)
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.BackColor = RGB(255, 255, 255)
End Sub
Автор: Anton T
Дата сообщения: 22.08.2006 12:45
Yuk
Спасибо, все получилось.


Цитата:
Примерно так

да, но бывает...
Когда я набираю "Бондар", а комбокс сам выделяет "енко", а потом вручную список дает Бондаренко, а Бондарчук не видно. Когда убираю "енко" и все видно:
Бондаренко
Бондарчук
Хочу чтоб комбокс автоматическая открыта.

Добавлено:
Попасная - это Украина из Луганской области
Автор: Yuk
Дата сообщения: 22.08.2006 16:36
Anton T
В свойствах комбобокса установи MatchEntry в 2 - fmMatchEntryNone.
В конец функции ComboBox1_Change добавь
ComboBox1.DropDown
Автор: agrippa
Дата сообщения: 22.08.2006 20:00
Yuk

Здравствуй. С прошлым заданием я разобрался. Но сейчас мне снова нужна помощь. Помоги,пожалуйста. Это очень важно.
Вот этот макрос преобразовывает *.txt файлы в нужный мне вид в Exel.
Пример таких текстовых файлов я тебе присылал, но если ты их удалил, то могу отослать заного. Напиши в тему и я их пришлю.
Тут вот в чём дело: мой макрос вызывает OpenFileDialog сам, а мне надо сделать, чтобы он делал преобразования в уже открытом текстовом файле.
Также он создает на втором, третьем листе, и так далее две зоны, которые разделены двумя пробелами, а мне нужно, чтобы эти зоны были не друг под другом, а рядом, и были разделены двумя строками, и так на каждом листе, кроме первого, т.к. там должен быть этот файл в первозданном виде.





Sub Preobrazovanie()
Dim fs, a, Str
Dim Sh As Worksheet
Dim d() As String
Dim name As String
'открываем стандартый OpenFileDialog

fileToOpen = Application.GetOpenFilename("Text Files (*.*), *.*")
If fileToOpen <> False Then
name = fileToOpen
End If

'открываем файл для считывания по строкам
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile(name)
'Set Sh = Worksheets("весь массив")
'Dim Dr As Range
'j = 1
List = 0
stroka = 0
stroka1 = 0
i = 1
'далеее в цикле до конца файла считываем все строки и анализируем их
List = List + 1
ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
Do While a.AtEndOfStream <> True
stroka = stroka + 1 '.. и начинаем запись на новом листе с первой строки
Str = a.ReadLine 'присваеваем строковой переменной str строку из файла
Str = Trim(Str) 'удаляем пробелы в строке в начале и в конце
d = Split(Str, " ") 'в динамический массив d записываем значения из строки разделенные пробелом

If Str = "" Then 'если строка пустая т.е. нет ничего просто ее мереписываем на текущий лист
Worksheets(List).Cells(stroka, 1) = "" 'просто записываем в первую ячейку нового листа считанную строку с датой
Else
If IsNumeric(d(0)) Then 'если у нас в строке числа то
'...в цикле записываем последовательно в ячейки текущей строки переменные массива
'попутно их проверяя на число, т.к. могут встречаться и не цифры
For j = LBound(d) To UBound(d) 'цикл для последовательного считывания элементов динамического массива
If IsNumeric(d(j)) Then 'проверка на число
Worksheets(List).Cells(stroka, i) = CDbl(d(j)) 'запись в ячейку листа значения, которое было переведено из строкового типа в double
i = i + 1
End If
Next
i = 1
Else
Worksheets(List).Cells(stroka, 1) = Str 'просто записываем в первую ячейку нового листа считанную строку с датой
End If
End If
Loop
a.Close
Set a = fs.OpenTextFile(name)
Do While a.AtEndOfStream <> True
Str = a.ReadLine 'присваеваем строковой переменной str строку из файла
Str = Trim(Str) 'удаляем пробелы в строке в начале и в конце
d = Split(Str) 'в динамический массив d записываем значения из строки разделенные пробелом
stroka = stroka + 1
stroka1 = stroka1 + 1
'далее идут проверки
If Str = "" Then 'если строка пустая т.е. нет ничего просто ее мереписываем на текущий лист
Worksheets(List).Cells(stroka, 1) = Str
Worksheets(List).Cells(stroka + 31, 14) = Str
Else 'если строка не пустая то начинаются проверки ...
If IsDate(d(0)) Then 'если это дата то созаем новый лист
If Len(d(0)) > 5 Then
'создаем новый лист
List = List + 1
stroka = 1 '.. и начинаем запись на новом листе с первой строки
stroka1 = 1 '.. и начинаем запись на новом листе с первой строки
ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
Worksheets(List).Cells(stroka, 1) = Str 'просто записываем в первую ячейку нового листа считанную строку с датой
Worksheets(List).Cells(stroka + 31, 14) = Str 'просто записываем в первую ячейку нового листа считанную строку с датой
End If
End If
If IsNumeric(d(0)) Then 'если у нас в строке числа то
'...в цикле записываем последовательно в ячейки текущей строки переменные массива
'попутно их проверяя на число, т.к. могут встречаться и не цифры
For j = LBound(d) To UBound(d) 'цикл для последовательного считывания элементов динамического массива
If IsNumeric(d(j)) Then 'проверка на число
Worksheets(List).Cells(stroka, i) = CDbl(d(j)) 'запись в ячейку листа значения, которое было переведено из строкового типа в double
Worksheets(List).Cells(stroka1 + 31, i + 13) = CDbl(d(j)) 'запись в ячейку листа значения, которое было переведено из строкового типа в double
i = i + 1
End If
Next
If i = 2 Then ' это условие необходимо для того чтобы писать две чиловые стороки файла в одну строку листа
stroka1 = stroka1 - 1
Else
i = 1
End If
Else
'если строка содержит просто какойто текст то, записываем его просто на лист
Worksheets(List).Cells(stroka, 1) = Str
Worksheets(List).Cells(stroka + 31, 14) = Str
End If
End If
Loop
a.Close
End Sub

Автор: Yuk
Дата сообщения: 23.08.2006 05:31
agrippa
Вообще-то я тут не являюсь штатным консультантом. На форуме много народа, кто может ответить на вопросы. Поэтому не надо обращаться к кому-то конкретно, если вопрос новый.

Файлов у меня не осталось, и я на конференции до конца недели. На небольшие вопросы может смогу отвечать, но разбираться в чужом коде пока нет времени. Проблему без примеров совершенно не понял.
Автор: SERGE_BLIZNUK
Дата сообщения: 23.08.2006 06:13
Yuk

Цитата:
Вообще-то я тут не являюсь штатным консультантом. На форуме много народа

Уважаемый Yuk - вами тут уже на раз восхищались. ;-)) Вот, пользуясь случаем, хочу сказать, что весь форум держится исключительно! вашими усилиями!
вот поэтому вас и спрашивают - знают, что если не вы - то надежды больше нет ;-)))

agrippa
аналогично. Абсолютно не понял вашу проблему... (что там за зоны, разделеные пробелом...) и вообще, это уже круто - нужно брать ваши txt файлы, запускать ваш код, изменять и отлаживать его... я, например, вряд ли потяну... прийдётся вам ждать возращения Yuk с конференции...

Добавлено:
выложите куда-нибудь архивчик с парой ваших тестовых txt файлов, описание проблемы (вплоть до скриншотов с обведённой проблемой ;-)) и xls с вашей функцией - ссылочку тут опубликуйте. Кто-нибудь обязательно посмотрит вашу программку...
Автор: agrippa
Дата сообщения: 23.08.2006 07:43

Цитата:
Уважаемый Yuk - вами тут уже на раз восхищались. ) Вот, пользуясь случаем, хочу сказать, что весь форум держится исключительно! вашими усилиями!
вот поэтому вас и спрашивают - знают, что если не вы - то надежды больше нет ))

Полностью согласен.

Вот ссылка на текстовый файл http://slil.ru/23047741
Надо просто открыть Exel и запустить макрос, а файл он сам предложит выбрать.
Кто проверит - тот поймёт мою проблему. Это тяжело объяснить.
Автор: SERGE_BLIZNUK
Дата сообщения: 24.08.2006 10:28
agrippa
посмотрел, и кажется понял, что вы хотите получить... ;-)))
у вас сверху вниз

Код:
данные 1
две пустые строки
данные 2
две пустые строки
данные 3
...
Автор: agrippa
Дата сообщения: 24.08.2006 16:24
SERGE_BLIZNUK

Цитата:
посмотрел, и кажется понял, что вы хотите получить... ))
у вас сверху вниз

Код:
данные 1
две пустые строки
данные 2
две пустые строки
данные 3
...


а Вам хотите вместо этого

Код:
Данные 1 [Два Пустых столбца ] Данные 2 [Два Пустых столбца ] Данные 3 ...


так?


Да. Именно так. Но сейчас я это уже сделал.
Теперь у меня немного другой вопрос. Как сделать так,чтобы можно было запустить макрос с того листа, с которого я хочу, и еще,если на этом листе что-то было до запуска макроса, то мой макрос всё это заменял теми данными,которые содержаться в текстовом файле,которые через него открываются?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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