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

» Excel VBA (часть 2)

Автор: Pozitivchik
Дата сообщения: 02.11.2009 14:55
ку,уважаемые форумчане.
у меня такая вот проблемка я нубло 3 степени,сказали на курсовую вот такую вот задачку решить,а препод лось.
Дан текстовой файл. Напечатать в алфавитном порядке все слова из заданого файла,имеющие длину n.
Автор: vlth
Дата сообщения: 02.11.2009 19:15
Pozitivchik

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

Если нужно будет делать сортировку слов по алфавиту не в диапазоне листа, а как элементов массива, поищи алгоритмы в Инете (сортировки пузырьковая или быстрая, к примеру)

Удачи!

модуль VBA Excel
Автор: 1nasty1
Дата сообщения: 02.11.2009 22:58
Нужно для контрольной работы решить уравнение Ax2 + Bx + C = 0
Есть решение:

Код: User Forml

'РЕШЕНИЕ КВАДРАТНОГО УРАВНЕНИЯ
'Ax2 + Bx + C = 0
'VBAProjectl.xls
'Процедура, выполняемая при нажатии на [CommandButton2]
Private Sub CommandButton2_Click()
'Описание переменных
Dim A As Single, B As Single
Dim С As Single
Dim Dis As Single
Dim Rel As Single, Re2 As Single
Dim Iml As Single, Im2 As Single
Dim Rl As Single, R2 As Single
'Описание окон ввода
A = Val(TextBoxA.Text)
В = Val(TextBoxB.Text)
С = Val(TextBoxC.Text)
'Определение дискриминанта
Dis = B^2 – 4*A*C
'Продолжение вычислений
'Вычисление корней
If Dis > 0 Then
'Вывод первого действительного корня
Rl = (– В + Sqr(Dis)) / 2 / А
TextBox5.Text. = Str(Rl)
'To же - второго действительного корня
R2 = (– В – Sqr(Dis)) / 2 / А
TextBox6.Text = Str(R2)
Else
'Вычисление вещественных частей корней
Rel = – В / 2 / А : Re2 = Rel
'Вычисление мнимых частей корней
Iml = Sqr(Abs(Dis)) / 2 / A : Im2 = – Iml
'Вывод первого комплексного корня
TextBox5.Text = Str(Rel) & " + i *" & Str(Iml)
'To же - второго комплексного корня
TextBox6.Text = Str(Re2) & " – i *" & Str(Abs(Im2) )
End If
'Конец процедуры, выполняемой при нажатии на [CommandButton2]
End Sub
'Процедура, выполняемая при нажатии [CommandButton1]
Private Sub CommandButton1_Click()
End
'Конец процедуры, выполняемой при нажатии на [CommandButton1]

End Sub
Автор: vlth
Дата сообщения: 03.11.2009 02:58
1nasty1

Ммм... зачем же файлом? - используйте Option Explicit, и удача Вас не оставит .

Я бы ещё заменил тип переменных на Double, а Val() - на CDbl()
И проверка корректности вводимых значений не помешала бы.
Автор: 1nasty1
Дата сообщения: 03.11.2009 03:28
vlth
Я имел ввиду файл *.xls - готовый вариант. Если не сложно отредактировать. Судя по предыдущим записям для Вас - минут пять работы.

Добавлено:
Для меня предыдущий пост как формула дезоксирибонуклеиновой кислоты )
Автор: SAS888
Дата сообщения: 03.11.2009 06:01
Pozitivchik
Можно, например, так:

Код: Sub Main()
Dim Filename As String, txt As String, i As Long, j As Long, n As Integer, a(), arr, x
Application.ScreenUpdating = False
'Получаем имя текстового файла.
Filename = Application.GetOpenFilename(, , , "Выберите файл для обработки", "Открыть")
If Filename = "" Then Exit Sub
'Задаем количество символов
n = InputBox("Количество символов", "Поиск слов")
'Считываем весь файл в переменную txt.
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.OpenTextFile(Filename, 1, True): txt = ts.ReadAll: ts.Close
'Убираем непечатные символы и лишние пробелы.
txt = Replace(txt, Chr(10), " "): txt = Replace(txt, Chr(13), " "): txt = Application.Trim(txt)
'Формируем массив всех слов.
arr = Split(txt, " "): ReDim a(1 To UBound(arr) + 1): j = 0
'Выбираем в другой массив все слова длиной в n символов.
For i = LBound(arr) To UBound(arr)
If Len(arr(i)) = n Then
j = j + 1: a(j) = arr(i)
End If: Next
If j = 0 Then Exit Sub Else ReDim Preserve a(1 To j)
'Сортируем массив
For i = LBound(a) To UBound(a) - 1
For j = i + 1 To UBound(a)
If a(i) > a(j) Then
x = a(i): a(i) = a(j): a(j) = x
End If: Next: Next
'Выводим результат в столбец "A".
Range([A1], Cells(UBound(a), 1)).Value = Application.Transpose(a)
End Sub
Автор: Alexikit
Дата сообщения: 03.11.2009 11:35
Inasty1
Создалось впечатление, что текст программы был набран симбиозом русскоанглийских букв.
В таком виде у меня отработало

Код:

'РЕШЕНИЕ КВАДРАТНОГО УРАВНЕНИЯ
'Ax2 + Bx + C = 0
'VBAProjectl.xls
'Процедура, выполняемая при нажатии на [CommandButton2]
Private Sub CommandButton2_Click()
'Описание переменных
Dim A As Double, B As Double
Dim C As Double
Dim Dis As Double
Dim Rel As Double, Re2 As Double
Dim Iml As Double, Im2 As Double
Dim Rl As Double, R2 As Double
'Описание окон ввода
A = Val(TextBoxA.Text)
B = Val(TextBoxB.Text)
C = Val(TextBoxC.Text)
'Определение дискриминанта
Dis = B ^ 2 - 4 * A * C
'Продолжение вычислений
'Вычисление корней
If Dis > 0 Then
'Вывод первого действительного корня
Rl = (-B + Sqr(Dis)) / 2 / A
TextBox5.Text = Str(Rl)
'To же - второго действительного корня
R2 = (-B - Sqr(Dis)) / 2 / A
TextBox6.Text = Str(R2)
Else
'Вычисление вещественных частей корней
Rel = –B / 2 / A
Re2 = Rel
'Вычисление мнимых частей корней
Iml = Sqr(Abs(Dis)) / 2 / A
Im2 = –Iml
'Вывод первого комплексного корня
TextBox5.Text = Str(Rel) & " + i *" & Str(Iml)
'To же - второго комплексного корня
TextBox6.Text = Str(Re2) & " – i *" & Str(Abs(Im2))
End If
'Конец процедуры, выполняемой при нажатии на [CommandButton2]
End Sub
'Процедура, выполняемая при нажатии [CommandButton1]
Private Sub CommandButton1_Click()
End
'Конец процедуры, выполняемой при нажатии на [CommandButton1]

End Sub
Автор: 1nasty1
Дата сообщения: 03.11.2009 12:29
Alexikit
Спасибо огромное. Текст действительно из распознанной гуглом книги в pdf. Я-то даже и не глянул сразу. l=1... Корни действительные нормально считает, а комплексные не сходятся с ответом почему-то.
Автор: Alexikit
Дата сообщения: 03.11.2009 14:17
Inasty1
Очень внимательно перенаберите весь текст программы по английски и все будет хорошо, опять нашла туже ошибку разности алфавита и сколько их там еще никто не знает, формулы вроде все правильные.
Автор: vlth
Дата сообщения: 03.11.2009 15:19
1nasty1
Как просил - .xls
Автор: 1nasty1
Дата сообщения: 03.11.2009 17:05
vlth
Спасибо за помощь! Реально выручили. И оформлено здорово, и код переписан, и ответы сходятся - лучше сделать просто невозможно!
Автор: vlth
Дата сообщения: 03.11.2009 18:47
1nasty1

Цитата:
лучше сделать просто невозможно


Возможно:
1. Сделать форму более "симпатичной" (кстати, не самая тривиальная задача)
2. Сделать её более удобной в работе (например, изменив обход элементов)
3. Обрабатывать ошибки ввода данных с выводом соответствующих сообщений
и т.д.

Alexikit

Цитата:
нашла туже ошибку разности алфавита и сколько их там еще никто не знает


Для отслеживания подобных вещей и существует Option Explicit
Автор: JackUser
Дата сообщения: 04.11.2009 11:49
Добрый день. Прошу помощи.

Есть класс, у него есть свойство - массив определенного пользователем
типа. Требуется сделать так, чтобы можно было работать с содержимым
этого массива извне класса. Объявить свойство-массив класса сразу как
Public, не дает Excel. Пробую сделать через Get/Let/Set

Код класса Library:
'свойство класса в виде массива пользовательского типа
Private inner_Book() As Record
'попытка получить значения
Public Property Get Book() As Record
(as Record выдает "Application-defined or object-defined error")
(as Object выдает "Only user defined types defined in public object modules...")
Book() = inner_Book()
End Property
---------------------------------------
Код модуля:
'пользовательский тип данных
Public Type Record
number As Long
End Type
'создание объекта
Dim myLibrary As Library
Set myLibrary = New Library

вот здесь мне нужно иметь возможность работать с элементами массива вот в таком виде
test = myLibrary.Book(1).number

как сделать чтобы это было возможно?




Автор: JackUser
Дата сообщения: 05.11.2009 07:25
И еще вопрос возник - как получить абсолютную и относительную ссылки на экземпляр класса (созданного мною)?

типа как this, MyBase, MyClass, Me

GetObject только для классов Excel

Me. работает только для форм

остальные вообще не пашут
Автор: mistx
Дата сообщения: 05.11.2009 11:23
Добрый день.
Имеется код. До выполнения данного кода необходимо, чтобы из одной ячейки (A2:A200) скопировалось значение в другую(Z2:Z200).

то есть в базу периодически будут добавляться записи.

a3,a4........

как это реализовать?
Автор: Simple Crypt
Дата сообщения: 06.11.2009 09:12
Камрады, вопрос простой, как танк - как найти последнее определённое значение в повторяющемся столбце?
То есть есть таблица
Яблоко 123
Груша 432
Яблоко 234
Слива 242
Груша 5634
Яблоко 345
Груша 345

Надо найти последнее значение "Яблоко" -> "345" ? ВПР ищет только первое. Надо тоже, но с конца.
Формулами, только формулами.
Автор: mistx
Дата сообщения: 06.11.2009 11:21
Ребята помогите с кодом, плиз

данный код вставляет дату в 3 столбце данного диапазона
а как сделать так, чтобы после набора в ячейках (B2:B100)
значение дублировалось (копировалось) в ячейки (Z2:Z100)?

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then
With Target(1, 2)
.Value = Format(Now, "Long Date")
End With
End If
If IsEmpty(Target) Then
Target(1, 2) = Empty
End If
End Sub
Автор: se111
Дата сообщения: 06.11.2009 13:31
Подскажите пожалуйста, есть ли способ как в Excel воткнуть drop down или что-то подобное, для выбора Контакта из Адресной книги Exchange , или хотя бы куда копать подскажите.

буду очень признателен за любую информацию
Автор: VictorKos
Дата сообщения: 07.11.2009 15:07
Simple Crypt
На сайте planetaexcel.ru в приёмах:
Улучшаем функцию ВПР (VLOOKUP)
В формуле вместо N подставить: СЧЁТЕСЛИ(диапазон;"Яблоко")
Автор: Alexikit
Дата сообщения: 10.11.2009 11:58
mistx

Цитата:

данный код вставляет дату в 3 столбце данного диапазона
а как сделать так, чтобы после набора в ячейках (B2:B100)
значение дублировалось (копировалось) в ячейки (Z2:Z100)?


Не очень поняла, что именно Вам нужно, но следующий код вставляет дату в выбранную ячейку и в ячейку, отстаящую от нее на 5 столбцов, а также число 55 на 4 строки ниже. Может это Вам поможет.

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target(1, 1)
.Value = Format(Now, "Long Date")
End With
With Target(1, 5)
.Value = Format(Now, "Long Date")
End With
With Target(4, 1)
.Value = 55
End With
End Sub
Автор: Drazhar
Дата сообщения: 10.11.2009 13:01
Доброе время суток. Не подскажете, каким образом можно использовать произвольныый компонент spreadsheet(конкретно сейчас используется spreadsheet 9.0 из msowc.dll) на любом компе с произвольным экселем >2000. При попытке подключить в качестве reference msowc.dll, реф подключается, но компонент недоступен.
Заранее спасибо за содержательные ответы
Автор: Peen
Дата сообщения: 10.11.2009 15:03
Столкнулся с таким вопросом

имеется строка:

Call SendEMail_via_CDO("EP-MOW-IT-SUPPORT", emailpref, "Manager's report", "<html><body>Employee name: " & "<font size=4>" & namemanager & "</font>" & "<br>" & "Mobile number" & ": " & "<font size=4>" & Cells(tmp, 11) & "</font>" & "<br>" & "Mobile cost" & ": " & "<font size=4>" & Cells(tmp, 25) & "$" & "</font>" & "<br>" & "Desk phone" & "Report's period: " & "<font size=4>" & ReportMonth & "." & ReportYear & "</font>" & "<br>Total expenses your subordinates: " & "<font size=4>" & c & "$" & "</font>" & "<br>" & "Number of subordinates: " & "<font size=4>" & kol & "</font>" & "<br>" & "<br><table border='0'><th>" & "Subordinate name/&#212;&#200;&#206; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#238;&#227;&#238;:" & "</th><th>" & "Mobile number/&#204;&#238;&#225;&#232;&#235;&#252;&#237;&#251;&#233; &#242;&#229;&#235;.:" & "</th><th>" & "Reporting Level/&#211;&#240;&#238;&#226;&#229;&#237;&#252; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#232;&#255;:" & "</th><th>" & "Amount/&#199;&#224;&#242;&#240;&#224;&#242;&#251;:" & "</th><th>" & "Responsible for Subordinates/&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#251;&#245;:" & "</th><th>" & "Summary Total/&#209;&#243;&#236;&#236;&#224;&#240;&#237;&#251;&#229; &#231;&#224;&#242;&#240;&#224;&#242;&#251; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#251;&#245;:" & "</th><th>" & strbody & vbNewLine & "</th></table>" & "<br>" & strbody2 & "</body></html>")

НО нужно еще добавить в эту строку еще кое что,но редактор не дает тк видимо закончилась срока.
есть перенос вместе с соединением строки - что бы это была все одна строка??
Автор: vlth
Дата сообщения: 10.11.2009 15:12
Simple Crypt

Получается формулой массива:

{=ДВССЫЛ("B"&(НАИМЕНЬШИЙ(ЕСЛИ((A1:A65535)="Яблоко";СТРОКА(A1:A65535);"");СЧЁТЕСЛИ(A:A;"Яблоко"))))}

или для произвольной пары столбцов ("Диапазон" - столбец №1):

{=СМЕЩ(ДВССЫЛ(АДРЕС(НАИМЕНЬШИЙ(ЕСЛИ((Диапазон)="Яблоко";СТРОКА(Диапазон);"");СЧЁТЕСЛИ(Диапазон;"Яблоко"));СТОЛБЕЦ(Диапазон)));0;1)}

Добавлено:
Peen
Лучше использовать в коде строковую переменную (-ые) или константу. Так и читаемость кода улучшится, и проблема ограничения кол-ва знаков в строке будет обойдена. Строковые переменные (или константы) объединяются знаком конкатенации & (амперсандом).

Добавлено:
Drazhar

Spreadsheet - это дополнительный элемент управления - ActiveX (т.е. его можно в редакторе VBA добавить в Toolbox и использовать в пользовательских формах).
Автор: Drazhar
Дата сообщения: 10.11.2009 17:22
vlth
Спасибо, но я знаю что такое spreadsheet. Меня интересует каким образом можно сделать экселевское приложение, использующее spreadsheet, переносимым(в рамках excel 2000+). То есть я перенес его на любой другой комп с 2000, XP, 2003,2007 экселем, а он нормально подхватился. Пока этого ни фига не происходит даже при добавлении(программно или руками) файла msowc.dll, в котором содержится ссылка на Spreadsheet.OWC.9(так он называется правильно)
Автор: vlth
Дата сообщения: 10.11.2009 17:39
Drazhar

Цитата:
При попытке подключить в качестве reference msowc.dll, реф подключается, но компонент недоступен.


Из описания проблемы я понял, что в проект VBA добавляется ссылка на dll, в то время, когда spreadsheet нужно добавлять в Toolbox...

Если же он помещается туда, куда надо, то непонятно, что значит
Цитата:
подключается, но компонент недоступен.

Он в тулбоксе виден? На форму выкладывается?
Автор: Drazhar
Дата сообщения: 10.11.2009 17:45
vlth
Set ID = ThisWorkbook.VBProject.References
curdir = ActiveWorkbook.Path
ID.AddFromfile (curdir & "\dll\MSOWC.DLL")
пробовал также
Set ID = VBProject.References
curdir = ActiveWorkbook.Path
ID.AddFromfile (curdir & "\dll\MSOWC.DLL")
Таким образом я его подключаю(добавляю в refernece активного проекта vba).
Накидываю компонент не на форму, а на лист через меню Элементы управления. После подключения как reference к VBP в тулбоксе ничего нет, хотя в рефах висит. И это странно.
Автор: vlth
Дата сообщения: 10.11.2009 18:57
Drazhar

Посмотри здесь:
Ссылка

У меня 9-го в списке контролов нет, а dll отдельно не регистрируется (видимо, нужен офис 2000)

Добавлено:
Кстати, John Walkenbach не рекомендует использовать spreadsheet в принципе, если на то нет острой необходимости, упоминая большие издержки при его применении.
Автор: Drazhar
Дата сообщения: 11.11.2009 08:39
vlth
Может тогда посоветуешь на замену компонент. Нужно что-нить что можно накинуть на лист(ms flexgrid отпадает) и прдставляющий из себя обычную таблицу. Заранее спс
Автор: mistx
Дата сообщения: 11.11.2009 11:09
Alexikit
спасибо. будет от чего отталкиваться.
Автор: filemoto
Дата сообщения: 11.11.2009 16:24
а есть ли в экселе чтото наподобие транспонирования данных, или чтото в это роде?
т.е.
у меня есть данные в ячейках:
1 Ширина A

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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