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

» Excel VBA (часть 3)

Автор: oshizelly
Дата сообщения: 04.12.2012 18:08
Black_Lung 17:59 04-12-2012
Цитата:
вместо ActiveCell попробуй Сells(номер строки, номер столбца)

Так а что вписать в качестве номера строки и номер столбца, Задача ведь заключается в том, чтобы макрос срабатывал для любой ячейки.
Автор: andrewkard1980
Дата сообщения: 04.12.2012 19:22

Цитата:
Прошу прощения за совсем детский вопрос. Как запрограммировать в макросе команду "вставить в текущую ячейку значение соседней слева ячейки + 10".
Спасибо!


ActiveCell = ActiveCell.Offset(0, -1).Value + 10

Но если будет выделена ячейка колонки А - будет ошибка.
Автор: oshizelly
Дата сообщения: 04.12.2012 19:25
andrewkard1980 19:22 04-12-2012
Цитата:
ActiveCell = ActiveCell.Offset(0, -1).Value + 10

Я правильно понимаю, что эту строку надо вставить в мой макрос, чтобы получилось вот так:

Код: Sub leftcell_plus_10()
'
' leftcell_plus_10 Macro
' Macro recorded 04.12.2012

Range("B1").Select
ActiveCell = ActiveCell.Offset(0, -1).Value + 10
Range("C1").Select
End Sub
Автор: andrewkard1980
Дата сообщения: 04.12.2012 19:40
oshizelly

да нет, просто:
Sub leftcell_plus_10()
If ActiveCell.column>1 then
ActiveCell = ActiveCell.Offset(0, -1).Value + 10
End if
End Sub
Автор: oshizelly
Дата сообщения: 04.12.2012 19:49
andrewkard1980

Работает! Спасибо
Автор: komputeryuzer
Дата сообщения: 05.12.2012 09:17
oshizelly

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


надо менять абсолютные адреса на относительные. оффсет это и есть отностельный адрес..
иначе будешь плакать навздрыть... ааааа!!! у меня абсолютные адреса записались аааа!!! а мне надо отностельные адреса аааа!!! что мне делать?!?!?! ааа!!!!

а надо "..подправлять.." и "..заменять.." то что тебе не нравится.. если бы всегда зписывалось то что надо и писать ничего надо было бы...


Цитата:
То есть, там записались абсолютные адреса ячеек B1 и C1, а не относительные "соседняя слева ячейка" и "текущая ячейка". Соответственно, макрос можно применять только в случае для пары ячеек B1 - C1. Это как бы не совсем то, что было надо


выше голову! я тоже не бльше тебя соображаю.... ))))))))))))))))))))
Автор: panda3
Дата сообщения: 06.12.2012 07:38
komputeryuzer


Цитата:
Дим ааа As String

ааа = "'[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!"
IsObject([aaa & "A1"]) НЕ РАБОТАЕТ

ааа = "'[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1"
IsObject([aaa]) НЕ РАБОТАЕТ

ааа = "['[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1]"
IsObject(aaa) НЕ РАБОТАЕТ
IsObject([aaa]) НЕ РАБОТАЕТ

Естественно, не работает. Команды Дим в VBA нет. Нужно писать Dim
Вот так будет работать:


Код: Dim aaa As String
aaa = "'[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1"
IsObject(Evaluate(aaa))
Автор: komputeryuzer
Дата сообщения: 06.12.2012 16:09
у меня так работает.. даже ааа не надо объявлять
IsObject(['[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1])
не работает когда через перемнные
Цитата:
вот так вроде работает:
IsObject(['[Отчёты за 2012 год.xlsx]Отчёт за октябрь (2012 года)'!A1])

а так через перемнные нет (у меня как раз перемнные):

dim otchety as string = "Отчёты за 2012 год.xlsx"
dim otchetoktyabr as string ="Отчёт за октябрь (2012 года)"
dim aaa as string = "'[" & otchety & "]" & otchetoktyabr & "!A1"
IsObject([aaa])


Автор: panda3
Дата сообщения: 06.12.2012 20:01
komputeryuzer
Вот объясни мне, зачем ты задаешь на форуме вопросы, если даже не читаешь на них ответы? Я тебе второй раз уже пишу абсолютно рабочий код, и второй раз ты мне в ответ заявляешь, что какой-то другой код, который ты сам придумал, не работает. Ну я уже понял, что твой код не работает, еще с первого раза. Поэтому и написал тебе рабочий код. Не надо повторять, что у тебя не работает, все уже это поняли. Надо просто взять рабочий код из моего предыдущего сообщения и использовать его. Ну или сообщить о проблемах с ним, если таковые найдутся.
Автор: KF121
Дата сообщения: 11.12.2012 12:56
Подскажите как поменять дефолтный каталог открываемый данным диалогом.Application.FileDialog(msoFileDialogFilePicker)
Всегда открывает мои документы, когда хочется текущую директорию или заранее указанную.

Спаисбо
Автор: panda3
Дата сообщения: 11.12.2012 14:07
KF121
Открыть справку по FileDialog, найти в ней свойство InitialFileName, прочитать и использовать по необходимости.
Для текущей директории использовать .InitialFileName = CurDir
Автор: KF121
Дата сообщения: 11.12.2012 19:08
panda3
Спасибо, чет даже не увидел InitialFileName поле.
Автор: Voodooism
Дата сообщения: 17.12.2012 14:53
[more] Есть задача, в зависимости от выбранного номера заполнить соответствующие ячейки информацией из текстбоксов.
я написал вот такой код:

A = Val(ComboBox1)
Select Case A

Case 1
Cells(5, 3) = ComboBox2
Cells(5, 5) = Val(TextBox2)
Cells(5, 6) = Val(TextBox3)


Case 2
Cells(6, 3) = ComboBox2
Cells(6, 5) = Val(TextBox2)
Cells(6, 6) = Val(TextBox3)

Case 3
Cells(7, 3) = TextBox1
Cells(7, 5) = Val(TextBox2)
Cells(7, 6) = Val(TextBox3)

Case 4
Cells(8, 3) = ComboBox2
Cells(8, 5) = Val(TextBox2)
Cells(8, 6) = Val(TextBox3)

Case 5
Cells(9, 3) = ComboBox2
Cells(9, 5) = Val(TextBox2)
Cells(9, 6) = Val(TextBox3)

Case 6
Cells(10, 3) = ComboBox2
Cells(10, 5) = Val(TextBox2)
Cells(10, 6) = Val(TextBox3)
End Select

Теперь нужно сделать так, чтобы при пустом текст боксе информация в ячейке не изменялась. Т.е. Если я заполняю текстбокс 2, а комбо бокс и текстбокс3 не трогаю, то заполняется соответствующая ячейка. А в остальных ячейках остается прежнее значение, а не 0. [/more]
Автор: LaCastet
Дата сообщения: 18.12.2012 11:34
Voodooism
Попробуй так:
Case 1
Cells(5, 3) = ComboBox2
If Not IsEmpty(Val(TextBox2)) Then Cells(5, 5) = Val(TextBox2)
If Not IsEmpty(Val(TextBox3)) Then Cells(5, 6) = Val(TextBox3)
Автор: Voodooism
Дата сообщения: 18.12.2012 19:22
[more] Спасибо за совет!
Я написал вот так:

If TextBox1 <> "" Then Cells(5, 3) = TextBox1
If TextBox2 <> "" Then Cells(5, 5) = Val(TextBox2)
If TextBox3 <> "" Then Cells(5, 6) = Val(TextBox3)

Странно, но изначально именно так и думал, и даже пробовал, но почему то прога не работала

Сейчас решаю другую задачу:

http://i.imgur.com/gniA5.jpg (на картинке табличка по которой нужно решить задачу)


Нужно написать цикл который последовательно в каждой строке перемножает ячейки 1*А и 2*В и записывает сумму произведений в ячейку итога.

Пока написал вот что:

For i = 2 To 4
Sum = 0
Sum = Sum + Cells(i, 2) * Cells(i, 4) + Cells(i, 3) * Cells(i, 5)
Cells(i, 6) = Sum
Next i

Но теперь задача усложняется, и нужно написать код для произвольного количества строк и столбцов.
Т.е. может произвольное количество пар типа 3*C, 4*D, 5*E и т.д. и увеличится количество строк.

Update.
Ситуацию увеличением количества строк я разобрал. Добавляем цикл определения последней строки:
k = 2
Do
If CStr(Cells(k, 1)) = "" Then
M = k - 1
Exit Do
Else
k = k + 1
End If
Loop
И меняем For i = 3 To 5 на For i = 2 To M

Со дополнительными столбцами пока что мрак Можно, конечно, добавить цикл определения последнего столбца, но тогда прийдется изменять основной цикл( ведь по сути, столбцы у меня вводятся вручную), а как это сделать я не соображу

Update:
Всё, задачу решил сам. Если кому интересно могу скинуть решение [/more]
Автор: NJCorp
Дата сообщения: 22.12.2012 13:36
Помогите решить такую задачку.
Нужно передать "математическое действие" переменной.
что то типа:
...
fnSum(2, "+", 3)
....


Function fnSum(a As Double, x As String, b As Double)
fnSum = ' ??? (2+3)
End Function

p.s. перебор не канает, там не одно действие.
Автор: AndVGri
Дата сообщения: 23.12.2012 05:31
fnSum = Application.Evaluate(CStr(a) & x & CStr(b))
Автор: Maximus777
Дата сообщения: 11.01.2013 11:15
Требуется средствами VBA сделать ресайз картинки JPG. Кто-нибудь сталкивался? Поделитесь, плиз, решением.
Автор: andrewkard1980
Дата сообщения: 13.01.2013 14:28
Резайз - это изменение размера или сжатие?
По размеру как то так:


Код:

Set rRng = Worksheets(1).Cells(17, i + 5)
Set pPic = rRng.Parent.Pictures.Insert(sLink)

With pPic
.Top = rRng.Top + 2
.Left = rRng.Left + 2
.Height = rRng.Height + 20
.Width = rRng.Width - 2
End With
Автор: KolyaP
Дата сообщения: 21.01.2013 13:50
Командная строка из VBA запускается в моём случае в директории "C:\Users\User\Documents>"
Как запустить её в любой произвольной директории?
Автор: Solenaja
Дата сообщения: 22.01.2013 12:32
подскажите почему ругается Excel 2013 на ActiveWorkbook.Unprotect Structure:=True
Compile error: Named argument not found


Код: Sub unprotect()

Dim PWORD As String, i As Integer, n As Integer
PWORD = "pass"
n = ActiveWorkbook.Sheets.Count
For i = 2 To n
With Sheets(i)
.EnableSelection = xlUnlockedCells
.Visible = 0
.protect Password:=PWORD, AllowFormattingRows:=True
End With
Next

Sheets(1).Unprotect Password:=PWORD, AllowFormattingRows:=True
Sheets(1).EnableSelection = xlUnlockedCells

With ActiveWindow
.DisplayHorizontalScrollBar = True
.DisplayVerticalScrollBar = True
.DisplayHeadings = True
.DisplayWorkbookTabs = True
.DisplayGridlines = True
End With
ActiveWorkbook.Unprotect Structure:=True
End Sub
Автор: andrewkard1980
Дата сообщения: 22.01.2013 18:51
KolyaP
Вы имеете ввиду cmd.exe ? Для запуска, если он находится в требуемой директории, необходимо изменить директорию по умолчанию так:

ChDir "C:\Users\User\Documents\cmd.exe"

и запустить так

Call Shell("C:\Users\User\Documents\cmd.exe", 1)


Добавлено:
Solenaja
Может книга не защищена?
Автор: KolyaP
Дата сообщения: 22.01.2013 19:46
andrewkard1980

Да я имею в виду cmd.exe

1. Он не находится в требуемой директории. Я даже не знаю, где он находится.
Запускаю его строчкой v = Shell("CMD", 1)
Не хотелось бы специально записывать его в нужную директорию для работы программы.

2. ChDir перед вызовом Shell не работает.
Автор: andrewkard1980
Дата сообщения: 22.01.2013 20:44
KolyaP
Не мое:
"1. запусти regedit

2. открой ветку
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
3. Если отсутсвует параметр Autorun, то создай его с типом REG_EXPAND_SZ или REG_SZ

4. Пропиши значение "CD /d E:\mydir", двойным щелчком мыши кликнув на "Autorun"

5. В результате при запуске cmd, текущей директорией будет E:\mydir"

Добавлено:
А вот вообще отличный способ, запуск сразу в требуемой директории:
Call Shell("cmd.exe /k cd /d d:\ & chdir d:\1", 1)

Добавлено:
/k - это видимый вариант - окно открыто, если поменять на /с - окно скроется
cd d/ d:\ - поменять диск
дальше вроде понятно
Автор: Solenaja
Дата сообщения: 22.01.2013 23:19
andrewkard1980
в том то и дело, что защищена
Автор: andrewkard1980
Дата сообщения: 23.01.2013 00:03
Solenaja
Может Structure:=True
лишнее,
из help:
expression.Unprotect(Password)

Автор: Solenaja
Дата сообщения: 23.01.2013 10:33
почему же тогда не ругается на накладывание защиты

Код: Sub protect()

Dim PWORD As String, i As Integer, n As Integer
PWORD = "xxx"
n = ActiveWorkbook.Sheets.Count
For i = 2 To n
With Sheets(i)
.EnableSelection = xlUnlockedCells
.Visible = 2
.protect Password:=PWORD, AllowFormattingRows:=True
End With
Next

Sheets(1).protect Password:=PWORD, AllowFormattingRows:=True
Sheets(1).EnableSelection = xlUnlockedCells

With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
.DisplayHeadings = False
.DisplayWorkbookTabs = False
.DisplayGridlines = False
End With
ActiveWorkbook.protect Structure:=True
End Sub
Автор: KolyaP
Дата сообщения: 23.01.2013 12:25

Цитата:
andrewkard1980



Спасибо!

Не Ваш способ не годится. Редактировать реестр это лишнее. Тем более вручную.

А вот второй способ решил проблему. Более того его можно сократить, убрав отдельно смену диска.
Всё работает, если сразу менять директорию.

Вот конечное решение:
v = Shell("CMD /k cd /d " & path_to_folder, 1)
Автор: andrewkard1980
Дата сообщения: 23.01.2013 18:49
KolyaP

Цитата:
Всё работает, если сразу менять директорию

У меня Win7 - сразу директорию менять не хочет, только после смены диска...
Автор: KolyaP
Дата сообщения: 23.01.2013 18:58
andrewkard1980

Странно, у меня тоже Windows 7 и работает сразу со сменой директории, даже если директория на другом диске.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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