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

» Excel VBA (часть 2)

Автор: Igor_Paseka
Дата сообщения: 17.12.2009 21:47
Есть форма. На ней есть TextBox. Как сделать что-бы текст в TextBox стал гиперссылкой на конкретный файл. Желательно что-бы все это делалось на форме.
Спасибо!
Автор: vlth
Дата сообщения: 18.12.2009 00:58
JekG
Посмотрел Вашу доработку. Кажется, я понял, почему у Вас моя процедурка "не сработала изначально": Вы, наверное, не догадались заглянуть в окно отладки, куда я для примера вывел результаты. Это окно Immadiate редактора VBE. Сделайте его видимым (пункт View строки меню -> Immadiate Window (Ctrl+G) ) и сравните то, что выводится туда, со значениями, которые Вы помещаете в ячейках справа от таблицы.

P.S. А зачем такой большой массив fam на 1000 мест? У Вас столько сотрудников?
Кстати, поскольку Вы не указали в разделе объявлений Option base 1, первый элемент массива fam(0) всегда равен пустой строке ("").
И ещё. Все остальные переменные в процедуре test(), поскольку им не присвоен явный тип, воспринимаются VBA как variant, что также не есть рационально.
Автор: JekG
Дата сообщения: 19.12.2009 16:41
vlth

Скрипт переписали. Теперь отбираем не по фамилии а по номеру пропуска.


Код: Option Explicit
Function prcEmplJobTimeCount(strSName As String)
Dim intI As Integer
Dim i

Sheets(1).Activate
Dim n1, endn, suma
n1 = 1
While Val(Range("C" & (n1 + 4))) <> Val(strSName)
n1 = n1 + 1
Wend
intI = n1
While Range("H" & (n1 + 4)) = "Выход"
Rows(n1 + 4).Select
Selection.Delete Shift:=xlUp
Wend
Do While Val(Cells(intI + 4, 3)) = Val(strSName)
intI = intI + 1
Loop
endn = intI - 1
suma = 0
For i = n1 To endn
suma = suma + Minute(Cells(4 + i + 1, 2)) - Minute(Cells(4 + i, 2)) + (Hour(Cells(4 + i + 1, 2)) - Hour(Cells(4 + i, 2))) * 60
i = i + 1
Next i
prcEmplJobTimeCount = suma
End Function

Sub Test()
Dim s, n, j, i, b, fam(2, 1000) As String

n = 1
fam(1, 1) = Range("C5")
fam(2, 1) = Range("D5")
i = 5
While Range("C" & i) <> ""

1 If Range("H" & i) = Range("H" & (i + 1)) Then
Rows(i + 1).Select
Selection.Delete Shift:=xlUp
GoTo 1
End If
b = False
For j = 1 To n
If Range("C" & i) = fam(1, j) Then
b = True
End If
Next j
If Not b Then
n = n + 1
fam(1, n) = Range("C" & i)
fam(2, n) = Range("D" & i)
End If
i = i + 1
Wend
Range("K5:M1663").Select
Selection.ClearContents
For i = 1 To n
s = prcEmplJobTimeCount(fam(1, i))
Range("K" & (5 + i)) = fam(1, i) + " " + fam(2, i) + " проработал(а): "
Range("L" & (5 + i)) = s
Range("M" & (5 + i)) = "минут!"
Range("N" & (5 + i)) = "="
Range("O" & (5 + i)) = s \ 60
Range("P" & (5 + i)) = "часов"
Range("Q" & (5 + i)) = s - (s \ 60) * 60
Range("R" & (5 + i)) = "Минут"
Next i
End Sub
Автор: vlth
Дата сообщения: 20.12.2009 01:25
JekG
Ммда... Дело хозяйское, конечно. Тем более, если и результат Вас устраивает.
Только обратите внимание, что Ваша программа считает суммарное отработанное сотрудником время без разбиения его по неделям. Может быть, конечно, это связано с тем, что в таблице данных больше, чем за одну неделю не бывает... - Вы этого не уточняли...
Автор: JekG
Дата сообщения: 20.12.2009 11:48
vlth
Обьясните причины скепсиса.
Автор: vlth
Дата сообщения: 20.12.2009 13:36
Прошу прощения, но интерес к Вашей задаче утрачен.
Автор: gadyatabankova
Дата сообщения: 20.12.2009 14:12
Здравствуйте, помогите, пожалуйста, написать макрос для Exsel, у самой не получается(((
Вот задание:

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

Заранее спасибо!
Автор: vlth
Дата сообщения: 20.12.2009 15:08
gadyatabankova

Код: Dim ColOfRows As Long, I As Long
With ActiveSheet.UsedRange
ColOfRows = .Rows.Count
For I = 1 To ColOfRows
.Rows(I).Offset(, 1) = .Rows(ColOfRows + 1 - I)
Next I
End With
Автор: metrim
Дата сообщения: 20.12.2009 17:36
vlth, прошу прощения, но разве "UsedRange" определит не границыВСЕГО диапазона? Ведь допустим на листе могут быть и другие данные...

Вообще

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

Цитата:
только вот опять туплю по простой задачке.
есть ячейка допустим R5C16 , ниже по столбику идут значения. Нужно определить последнюю заполненную ячейку и получить для формулы диапазон например R5C16:R31C16

Вообще все это нужно для подстановки в формулу

Код:

Код: Cells(2, 14).FormulaR1C1 = "=SUMX2MY2(R5C16:R11C16,R5C17:R11C17)"
Автор: vlth
Дата сообщения: 20.12.2009 21:05
metrim

Цитата:
прошу прощения, но разве "UsedRange" определит не границыВСЕГО диапазона? Ведь допустим на листе могут быть и другие данные...

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

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

1. Мешает стиль R1C1 (не так критично, но требует доп. усилия для понимания). Если не трудно, сформулируйте, пожалуйста, записи в абсолютных ссылках.
2. Что за фунция - SUMX2MY2 ? - можно её локализованный вариант?
Автор: dinaparfenova
Дата сообщения: 20.12.2009 21:38
Здравствуйте, помогите, пожалуйста, написать макрос для Exsel. я не знаю как делать.
Задание:

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

Заранее спасибо!
Автор: gadyatabankova
Дата сообщения: 20.12.2009 21:41
Спасибо огромное за помощь!!
Автор: vlth
Дата сообщения: 20.12.2009 22:08
metrim

Цитата:
Может подскажете, как определить них заполненного столбика значений, если верхняя его ячейка известна?

Посмотрите мой ответ участнику pribush на предыдущей странице ниже Ваших сообщений. Там есть два варианта определения нижней ячейки столбца.
Автор: metrim
Дата сообщения: 20.12.2009 22:43

Цитата:
Я уже вчитывался в Ваш вопрос, но тогда, как и теперь, не смог его понять:

1. Мешает стиль R1C1 (не так критично, но требует доп. усилия для понимания). Если не трудно, сформулируйте, пожалуйста, записи в абсолютных ссылках.
2. Что за фунция - SUMX2MY2 ? - можно её локализованный вариант?

Экселевская функция

Код: =СУММРАЗНКВ(P5:P76;Q5:Q76)
Автор: vlth
Дата сообщения: 21.12.2009 00:35
metrim

Цитата:
pribush

Код:Sub Example()
Dim i As Long, k As Long, x As Long
With Thisworkbook.Worksheets("Лист1")
x = .UsedRange.Rows.Count 'вариант x=.cells(65536,1).end(xlup).row




Добавлено:
Это так можно найти последнюю заполненную ячейку в столбце (номер строки)
Если все ячейки столбца заполнены, можно ещё воспользоваться функцией раб листа:
x=application.worksheetfunction.counta(.columns(номер_столбца))

Добавлено:

Код: With ActiveSheet
x = .Cells(65536, 16).End(xlUp).Row
'(x = .Range("P65536").End(xlUp).Row)
.Cells(2, 14).FormulaR1C1 = "=SUMX2MY2(R5C16:R" & x & "C16,R5C17:R" & x & "C17)"
End With
Автор: metrim
Дата сообщения: 21.12.2009 01:13

Цитата:
metrim

Цитата:
....
Дык в том то и проблема, что у меня на листе есть и другие столбцы, которые значительно длиннее подопытного Так что "использованный диапазон" наверное укажет нижние границы именно их...


Цитата:
Это так можно найти последнюю заполненную ячейку в столбце (номер строки)
Если все ячейки столбца заполнены, можно ещё воспользоваться функцией раб листа:
x=application.worksheetfunction.counta(.columns(номер_столбца))
В принципе по логике это наверное даже то что мне нужно, но во первых функция:

Код: Function подсчет_в_столбце()
подсчет_в_столбце = Application.WorksheetFunction.CountA(.Columns(20))
End Function
Автор: killnur
Дата сообщения: 21.12.2009 06:13
здраствуйте, помогите пожалуйста с макросом!
нужно чтобы по нажатию кнопки находилось решение функции и выдавало ее в два столбца(x и y) на заданном отрезке с заданным шагом...вот что у меня вышло...


Код: Function calcF(ByVal x As Double) As Double
calcF = Evaluate(Replace(TextBoxF.Value, "x", Str(x)))
End Function

Private Sub paintgraph_click()
Dim x As Double
Range("A10, b100").Value = " "
x = Val(TextBoxGA.Value)
i = 10
Do While x <= Val(TextBoxGB.Value) And i <= 100
Cells(i, 1) = x
Cells(i, 2) = calcF(x)
x = x + Val(TextBoxGH.Value)
i = i + 1
Loop
End Sub
Автор: vlth
Дата сообщения: 21.12.2009 07:55
metrim

Цитата:
выдает по поводу ".Columns"

Код:Invalid or unqualified reference

Вы вырвали "фразу" из контекста - конструкции With - End With, поэтому ошибка и возникает. Иначе говоря, достаточно убрать точку перед "Columns".

А чем Вас не устраивает

Код: номер_строки_последней_несвободной_ячейки = Cells(65536, номер_столбца).End(xlUp).Row
Автор: Troitsky
Дата сообщения: 21.12.2009 09:39
metrim

Цитата:
Вообще все это нужно для подстановки в формулу

Код: Cells(2, 14).FormulaR1C1 = "=SUMX2MY2(R5C16:R11C16,R5C17:R11C17)"


на которую так и не нашлось ответа.

Может подскажете, как определить них заполненного столбика значений, если верхняя его ячейка известна?
Автор: SIgor33
Дата сообщения: 21.12.2009 09:46
на листе имеется защищенные и не защищенные ячеики. подскажите как vba узнать какие ячейки из диапазона есть(защищена она или нет)
Автор: vlth
Дата сообщения: 21.12.2009 11:37
SIgor33

Код: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.AllowEdit = True Then MsgBox "В выделенном диапазоне защищённых ячеек нет."
End Sub
Автор: SIgor33
Дата сообщения: 21.12.2009 12:11
vlth
спасибо за совет
Автор: dinaparfenova
Дата сообщения: 21.12.2009 14:02
привет! помогите с заданием, пожалуйста!

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

спасибо)
Автор: killnur
Дата сообщения: 21.12.2009 17:47
vlth


Цитата:
Смотрите, что Вы делаете:
1. функция должна найти в текстбоксе букву "x" (которой там нет и быть не может, насколько я понимаю) и заменить её на число, содержащееся в переменной типа Double, преобразованное в строковое значение. Зачем? Что Вы этим хотите достичь?
2. Что со всем этим должна делать evaluate?


1 в этом текстбоксе указывается сама функция к которой и нужно найти решение то есть там уравниние наподобии x^2+3*x-5 а по поводу тонкостей чесно скажу сам не разбираюсь в этом(все что написал было с подсказок препода и как оказалось у него неправильно))) ) но так как вы написали не подходит...((он выдает ошибку и ничего не находит(((
Автор: vlth
Дата сообщения: 21.12.2009 18:54
killnur
Понятно. Тогда у Вас всё работает
Не знаю, как там с шагами, но функция вычисляется
Автор: dinaparfenova
Дата сообщения: 21.12.2009 19:16
извините, а почему вы не обращаете внимание на мое задание? вы не знаете как его делать???
Автор: vlth
Дата сообщения: 21.12.2009 19:48
Просто не хочу. Возможно, это были и не Вы, как я думаю, и ответ на подобный вопрос вчера получила Ваша подруга...
Короче говоря, читайте шапку: там написано про рыбу.
Автор: dinaparfenova
Дата сообщения: 21.12.2009 19:56
если Вы имеете мою подругу, то у неё в задании расположить числа в обратном порядке, а в моем задании 3 числа максимальных по модулю.
Автор: bamaslak
Дата сообщения: 21.12.2009 20:35
Ребят помогите, пожалуйста, зачетная неделя, а у меня не сдан макросы, в которых вообще ничего не понимаю! выручите кто может!

1. word. В каждом слове текущего предложения изменить порядок букв на обратный.

2. excel. Кусочно-линейная функция f(x) представлена в виде таблицы, состоящей из двух одинаковых по высоте столбцов чисел. В первом столбце находятся значения x, во втором — значения f. Значения x строго монотонно возрастают. Высота столбцов n заранее неизвестна, но она точно больше одного (таким образом, задан как минимум один линейный участок). Создать третий столбец высоты n, содержащий значения интеграла от f(x) по x от самого первого значения x до текущего значения x.

Заранее огромное спасибо!
Автор: vlth
Дата сообщения: 21.12.2009 21:23
dinaparfenova

Цитата:
если Вы имеете мою подругу
Странное предположение, не находите? )))


Код: Dim ColOfRows As Long, I As Long, aArray() As Single
With ActiveSheet.UsedRange
ColOfRows = .Rows.Count
ReDim aArray(ColOfRows - 1)
For I = 1 To ColOfRows
.Rows(I).Offset(, 1) = .Rows(I) ^ 2
aArray(I - 1) = .Rows(I)
Next I
End With
With ActiveSheet.UsedRange
.Sort Key1:=.Cells(1, 2), Order1:=xlDescending, Header:=xlNo
.Columns(2).Clear
End With
With ActiveSheet.UsedRange
For I = 1 To 3
.Rows(I).Offset(, 1) = .Rows(I)
Next I
For I = 1 To ColOfRows
.Rows(I) = aArray(I - 1)
Next
End With

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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