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

» Excel VBA (часть 2)

Автор: GreenRay
Дата сообщения: 11.05.2007 07:52
Как присвоить диапазону значение B2:D2, если значение row =2 ?
У меня получается только как

Код:
For Each Cell In Range("E2:E1000")
If Cell > 100 Then

NumberRow = Cell.Row
Name = "B" & NumberRow & ":" & "D" & NumberRow
Range(Name).Select
End if
Next Cell
Автор: aks_sv
Дата сообщения: 11.05.2007 08:28
Имеется таблица с данными, в одном столбце есть пустые ячейки. Вопрос: как расположить все непустые ячейки в столбце подряд, без пропуска ?
Автор: AndVGri
Дата сообщения: 11.05.2007 08:32
GreenRay
[
Цитата:

NumberRow = Cell.Row
Name = "B" & NumberRow & ":" & "D" & NumberRow
Range(Name).Select

Можно заменить на

Код:
Union(Cell.Offset(0, -2), Cell.Offset(0, -1)).Select
Автор: aks_sv
Дата сообщения: 11.05.2007 09:26
AndVGri
Насчет сортировки как-то не подумал.

Цитата:
Или удали пустые ячейки полностью со строками

А удалять пустые строки нельзя, могут пропать данные из других столбцов
Спасибо.
Автор: GreenRay
Дата сообщения: 11.05.2007 09:40
AndVGri
Спасибо.

Добавлено:
Подскажите, пожалуйста, как привести значение ФАМИЛИЯ к виду Фамилия
Автор: AndVGri
Дата сообщения: 11.05.2007 10:09
GreenRay
Вопрос для Excel Faq. Читай описания текстовых функций
Автор: GreenRay
Дата сообщения: 11.05.2007 11:12
AndVGri

С помощью функций lcase len left right ?
Автор: The okk
Дата сообщения: 11.05.2007 12:19
GreenRay
C помощью формулы =ПРОПНАЧ(). AndVGri правильно сказал - с подобными вопросами лучше в тему Excel FAQ
Автор: GreenRay
Дата сообщения: 11.05.2007 13:05
The okk
Попробовал предложенную вами функцию

Код:
Proper (Cell.Offset(0, -2))
Автор: AndVGri
Дата сообщения: 11.05.2007 14:02
GreenRay
sProperName = Application.WorksheetFunction.Proper(ActiveCell.Value)
Автор: The okk
Дата сообщения: 11.05.2007 14:06
GreenRay
а зачем вообще VBA для этого использовать? - в экселе есть функция.
А если уж VBA, то можно еще и:

Код: sProperName = StrConv("Фамилия",vbProperCase)
Автор: PavelO
Дата сообщения: 12.05.2007 13:13
Есть такая проблемка. Нужен такой код, который через Ексель заменяет значения в базе Аццесс. Что я имею ввиду? Есть два файлика. Один .xls, другой .mdb. mdb содержит большую базу данных, xls содержит информации поменьше, но есть схожая. Как сделать так, чтобы изменяя ячейку в xls менялась и mdb база? Может у кого есть соображения на эту тему?
Автор: jONES1979
Дата сообщения: 12.05.2007 14:06
PavelO синхронно изменять "и там и тут" вероятно геморройней, чем повесить "обновление mdb" на отдельную кнопочку.
В целом решать можно двумя путями: универсально через ADO (тогда как бы даже и не требуется установленного MSOffice Access) или же через объектную модель Access-а
Автор: pila007
Дата сообщения: 13.05.2007 11:28
помогите дорешать задачку
Ввести массив A(N).Задать число L.Вывести на печать исходный массив, значения первого элемента массива больше L, число элементов массива больших L
вот я ввел в Excel числа 6 -12     14 12 16 19 21 -6
числа больше L он правильно читает, а 1-ое число больше L читает с конца, т.е указывает на цифру 21
Sub four() '99
ReDim a(8)
c = 0
L = 15 ' заранее заданное число
For i = 1 To 8
a(i) = Cells(i)
If a(i) > L Then
r = a(i)
c = c + 1
End If
Next i
MsgBox (" таких чисел " & c & " первое число больше L= " & r)
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 11:33
pila007

Код:
Dim isFirst As Boolean

isFirst = True
'...
If a(i) > L Then
'...
If isFirst Then isFirst = False: r = a(i)
'...
Автор: Anton T
Дата сообщения: 13.05.2007 11:45
Сделал расширенный поиск, взял на ozgrid.com.
Вот смотри рисунок:

отображается адрес ячейки, а вообще мне надо отображается так "Павленко Наталья Андреевна Киев Ленина 150 и т.д...(всего 12 стольбцов)" Поправить не знаю, то как? Но знаю , в коде ListBox1.AddItem rCell.Address & ":" & rCell(1, 3).Address заменяем на ListBox1.AddItem rCell.Address & " " & rCell(1, 12).Address получили полное имя, но если дважды раз - вылетела ошибка в желтую строку: Application.Goto Range(ListBox1.Text), True
[more=Такой код]
Код:
Option Explicit

'Module Level Variables
Dim rRange As Range
Dim strFind1 As String
Dim strFind2 As String
Dim strFind3 As String


Private Sub ComboBox1_Change()
'Pass chosen value to String variable strFind1
strFind1 = ComboBox1
'Enable ComboBox2 only if value is chosen
ComboBox2.Enabled = Not strFind1 = vbNullString
End Sub


Private Sub ComboBox2_Change()
'Pass chosen value to String variable strFind1
strFind2 = ComboBox2
'Enable ComboBox3 only if value is chosen
ComboBox3.Enabled = Not strFind2 = vbNullString
End Sub


Private Sub ComboBox3_Change()
'Pass chosen value to String variable strFind1
strFind3 = ComboBox3
End Sub

Private Sub CommandButton1_Click()
'Procedure level variables
Dim lCount As Long
Dim lOccur As Long
Dim rCell As Range
Dim rCell2 As Range
Dim rCell3 As Range
Dim bFound As Boolean

'At least one value, from ComboBox1 must be chosen
If strFind1 & strFind2 & strFind3 = vbNullString Then
MsgBox "No items to find chosen", vbCritical
Exit Sub 'Go no further
ElseIf strFind1 = vbNullString Then
MsgBox "A value from " & Label1.Caption _
& " must be chosen", vbCritical
Exit Sub 'Go no further
End If

'Clear any old entries
On Error Resume Next
ListBox1.Clear
On Error GoTo 0

'If String variable are empty pass the wildcard character
If strFind2 = vbNullString Then strFind2 = "*"
If strFind3 = vbNullString Then strFind3 = "*"

'Set range variable to first cell in table.
Set rCell = rRange.Cells(1, 1)
'Pass the number of times strFind1 occurs
lOccur = WorksheetFunction.CountIf(rRange.Columns(1), strFind1)

'Loop only as many times as strFind1 occurs
For lCount = 1 To lOccur
'Set the range variable to the found cell. This is then also _
used to start the next Find from (After:=rCell)
Set rCell = rRange.Columns(1).Find(What:=strFind1, After:=rCell, _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
'Check each find to see if strFind2 and strFind3 occur _
on the same row.
If rCell(1, 2) Like strFind2 And rCell(1, 3) Like strFind3 Then
bFound = True 'Used to not show message box for no value found.
'Add the address of the found cell and the cell on the _
same row but 2 columns to the right.
ListBox1.AddItem rCell.Address & ":" & rCell(1, 3).Address
End If
Next lCount

If bFound = False Then 'No match
MsgBox "Sorry, no matches", vbOKOnly
End If
End Sub

Private Sub CommandButton2_Click()
'Close UserForm
Unload Me
End Sub


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'Check for range addresses
If ListBox1.ListCount = 0 Then Exit Sub
'GoTo doubled clicked address
Application.Goto Range(ListBox1.Text), True
End Sub

Private Sub UserForm_Initialize()
'Procedure level module
Dim lRows As Long

'Set Module level range variable to CurrentRegion _
of the Selection
Set rRange = Selection.CurrentRegion
If rRange.Rows.Count < 2 Then ' Only 1 row
MsgBox "Please select any cell in your table first", vbCritical
Unload Me 'Close Userform
Exit Sub
Else
With rRange
'Set Label Captions to the Table headings
Label1.Caption = .Cells(1, 1)
Label2.Caption = .Cells(1, 2)
Label3.Caption = .Cells(1, 3)

'Set RowSource of ComboBoxes to the appropriate columns _
inside the table
ComboBox1.RowSource = .Columns(1).Offset(1, 0).Address
ComboBox2.RowSource = .Columns(2).Offset(1, 0).Address
ComboBox3.RowSource = .Columns(3).Offset(1, 0).Address
End With
End If
End Sub

Private Sub UserForm_Terminate()
'Destroy Module level variables
Set rRange = Nothing
strFind1 = vbNullString
strFind2 = vbNullString
strFind3 = vbNullString
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 12:22
Anton T
А, что собственно, хотел?
А ошибка вылетает потому что адрес, содержащийся в ListBox1.Text, для Range(ListBox1.Text) не содержит символа диапазона ":"?, то есть вместо положенного "$A$17:$C$17" содержит пробел "$A$17 $C$17".
Автор: pila007
Дата сообщения: 13.05.2007 12:37
вот так?
если так то нечего неполучается, опять 21 выходит.
Sub four() '99
ReDim a(8)
Dim isFirst As Boolean
isFirst = True
c = 0
L = 15 ' заранее заданное число
For i = 1 To 8
a(i) = Cells(i)
If a(i) > L Then
r = a(i)
c = c + 1
If isFirst Then isFirst = False: r = a(i)
End If
Next i
MsgBox (" таких чисел " & c & " первое число больше L= " & r)
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 13:01
pila007

Цитата:
r = a(i)
c = c + 1

вот здесь r = a(i) убери
Автор: pila007
Дата сообщения: 13.05.2007 14:01
AndVGri
спасибо
а ты знаешь как сделать чтобы программка вычисляла _каждый_ столбец массива, а не
сразу два:
вот код
Sub one()
Dim a(10, 2) As Double
Cells(12, 1) = 0
Cells(14, 1) = 1
For i = 1 To 10
For j = 1 To 2
Cells(i, j) = Int((10 - (-10) + 1) * Rnd + (-10))
a(i, j) = Cells(i, j)
If a(i, j) <= 0 Then
Cells(12, 1) = Cells(12, 1) + a(i, j)
Else
Cells(14, 1) = Cells(14, 1) * a(i, j)
End If
Next j
Next i
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 14:32
pila007
А зачем? Если очень надо, то делай цикл по i дважны в первом заменяешь j на 1, во втором j на 2
Автор: pila007
Дата сообщения: 13.05.2007 15:19
да проста задание такое, чтобы произведение и сумма нужно вычеслить каждого столбца.
"то делай цикл по i дважны в первом заменяешь j на 1, во втором j на 2 "
да я тоже также попробовал сделать но можно его как-нибудь упростить?

Sub one()
Dim a(10, 2) As Double
Cells(12, 1) = 0
Cells(14, 1) = 1
For i = 1 To 10
For j = 1 To 1
Cells(i, 1) = Int((10 - (-10) + 1) * Rnd + (-10))
a(i, 1) = Cells(i, 1)
If a(i, 1) <= 0 Then
Cells(12, 1) = Cells(12, 1) + a(i, 1)
Else
Cells(14, 1) = Cells(14, 1) * a(i, 1)
End If
Next j
Next i
Cells(12, 2) = 0
Cells(14, 2) = 1
For i = 1 To 10
For j = 2 To 2
Cells(i, 2) = Int((10 - (-10) + 1) * Rnd + (-10))
a(i, 2) = Cells(i, 2)
If a(i, 2) <= 0 Then
Cells(12, 2) = Cells(12, 2) + a(i, 2)
Else
Cells(14, 2) = Cells(14, 2) * a(i, 2)
End If
Next j
Next i
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 16:53
pila007
А кто тебе мешает в первоначальном варианте добавить
Cells(12, 2) и Cells(14, 2) для второго столбца проверяешь
If j = 1 Then
Cells(12, 1).Value = Cells(12, 1).Value + a(i, 1)
'...
Else
Cells(12, 2).Value = Cells(12, 2).Value + a(i, 2)
'...
End If
Автор: pila007
Дата сообщения: 13.05.2007 17:06
еще раз спасибо
а как решается вот эта задачка:
5.Ввести массив A(N). Преобразовать его так, чтобы значения элементов являлись суммой элемента массива и его индекса. Вывести на печать исходный и преобразованный массивы.
Sub five()
Dim a(7)
s = 0
k = 1
For i = n To 1 Step 1
s = s + a(i)
k = k + 1
Next i
End Sub
Автор: AndVGri
Дата сообщения: 13.05.2007 17:19
pila007
Вместо s = s + a(i)
a(i) = a(i) + i 'получишь

Цитата:
значения элементов являлись суммой элемента массива и его индекса

Автор: pila007
Дата сообщения: 13.05.2007 17:46
AndVGri
чё-то не понял, объясни пожалуйста на задачке, что ласт эта строчка?

Цитата:
a(i) = a(i) + i

Автор: AndVGri
Дата сообщения: 13.05.2007 18:59
pila007
Глубокоуважаемейший, выдели в коде a(i), нажми на выделении правую клавишу и выбери Add watch внизу появится панелька, отображающая состояние переменной. Затем, пошагово по F8 пройдись по твоему коду и посмотри, чему будет равно a(i) до и после a(i) = a(i) + i
Данный процесс называется отладкой
Автор: GreenRay
Дата сообщения: 14.05.2007 05:17
The okk
Для вывода списка именинников

Код:
Application.DisplayAlerts = False
Workbooks.Open Filename:= _
"\\Server1\Руководство\Kadry\KADRI.DBF"
Sheets("KADRI").Select
Sheets("KADRI").Name = "Сотрудники"

Rows("1:1").RowHeight = 25.5
Range("A1:S1").Select
With Selection

.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With

Range("a1").Value = "Таб. Номер"
Range("b1").Value = "Фамилия"
Range("c1").Value = "Имя"
Range("d1").Value = "Отчество"
Range("e1").Value = "Дата рождения"
Range("f1").Value = "Образование"

Range("G1:H1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With

Range("G1").Value = "Специальность"
Range("i1:j1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("i1").Value = "Должность"
Range("k1").Value = "Номер приказа"
Range("l1").Value = "Дата приема"
Range("m1").Value = "Город"
Range("n1").Value = "Улица"
Range("o1").Value = "Дом"
Range("p1").Value = "Квартира"
Range("q1").Value = "Подр-е"
Range("r1").Value = "Гр.опл."

Range("A1").Select


Range("A1:S478").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Columns("B:B").ColumnWidth = 17.71
Columns("D:D").ColumnWidth = 17.71
Columns("E:E").ColumnWidth = 10.71
Columns("G:G").ColumnWidth = 16.43
Columns("H:H").ColumnWidth = 16.43
Columns("I:I").ColumnWidth = 12.71
Columns("J:J").ColumnWidth = 12.71
Columns("L:L").ColumnWidth = 10.71
Columns("P:P").ColumnWidth = 4.43
Columns("Q:Q").ColumnWidth = 4.29
Columns("R:R").ColumnWidth = 3.14
Columns("S:S").ColumnWidth = 11.14


msgfinal = "Сегодня" & Chr(32) & Date & Chr(32) & "день рождения:" & vbCr
Style = vbYes + vbInformation ' Define buttons.
Title = "Сегодня именинники"

Columns("E:E").Select
Selection.NumberFormat = "m/d/yyyy"


'strDay - переменная текущих дня и месяца ,приведенная к числовому виду
strDay = (Day(Now) * 100 + Month(Now))

IsBirthday = False

For Each Cell In Range("E2:E1000")
If Day(Cell) * 100 + Month(Cell) = strDay Then
IsBirthday = True
DateOfBirthday = Cell.Value
Union(Cell.Offset(0, -3), Cell.Offset(0, -2), Cell.Offset(0, -1)).Select
msgfinal = msgfinal & vbCr & DateOfBirthday & Chr(32) & "у" & Chr(32) & _
' Фамилия ,Имя, Отчество выводятся ПРОПИСНЫМИ символами
Cell.Offset(0, -3) & Chr(32) & Cell.Offset(0, -2) & Chr(32) & Cell.Offset(0, -1)
End If
Next Cell

If IsBirthday = True Then
Result = MsgBox(msgfinal, Style, Title)
End If

Range("E2").Select

ActiveWindow.FreezePanes = True



End Sub
Автор: GFSGF
Дата сообщения: 14.05.2007 10:48
AndVGri
можно ли в MsgBox применить форматироание шрифта,например его увеличить или цвет поменять?
Автор: The okk
Дата сообщения: 14.05.2007 11:28
Anton T

Цитата:
Application.Goto Range(ListBox1.Text), True

В отладчике посмотри, что из себя представляет ListBox1.Text при появлении ошибки

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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