Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: InputBox, выделить диапазон Добавлено: 31.07.07 18:31  

Автор вопроса:  VBACool
Здравствуйте.
Есть простая задача.
1. Посредством InputBox пользователь вводит номер первой и последней строки нужного диапазона.
2. Далее надо выделить ячейки первого столбца между введенными строками и посчитать сумму.
3. Затем сдвинуть диапазон на 3 столбца вправо и опять посчитать сумму в этом диапазоне.
4. Повторить 3 действие еще 2 раза, сдвиную диапазон вправо на 2 и 3 столбца.
5. Записать полученные суммы в соответствующие ячейки на другом листе.

Лист1
То есть пользователь ввел номер первой строки (5) и второй (9).
Выделился диапазон A5:A9. Суммировать диапазон. Сдвинуть на D5:D9. Суммировать. Сдвинуть на F5:F9. Суммировать. И т.д. сколько нужно раз. Запомнить суммы (просто присвоить их переменным?). На листе Лист2 вставить сумму диапазона A5:A9 в ячейку B2, D5:D9 в E2 и т.д. Все.
Помогите, плиз такое реализовать.

Пробовал так:

Sub Macro1()
   S1 = InputBox("Номер первой строки диапазона:")
   S2 = InputBox("Номер второй строки диапазона:")
   Range(Cells(S1, 1), Cells(S2, 1)).Selected
End Sub

Пишет:
Object doesn't support this property or method.

И еще вопрос, как сделать такое:

Sub Macro1()
   Col1 = InputBox("Номер столбца диапазона:")
   Srt1 = InputBox("Номер строки диапазона:")
   Range(Col1, Srt1).Activate
End Sub

Если так - пишет:
Methon 'Range' of object '_Global' failed

Спасибо.

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #1 Добавлено: 31.07.07 18:50
Чтобы выделить надо просто Select, а не Selected

Попробуйте что-нибудь такое

Sub Macro1()
Dim S1&, S2&, iCol&
   S1 = InputBox("Номер первой строки диапазона:";)
   S2 = InputBox("Номер второй строки диапазона:";)
   iCol = 1
   Sheets("Лист2";).Cells(2, iCol + 1).Value = Application.Sum(Sheets("Лист1";).Range(Cells(S1, iCol), Cells(S2, iCol)))
   iCol = iCol + 3
   Sheets("Лист2";).Cells(2, iCol + 1).Value = Application.Sum(Sheets("Лист1";).Range(Cells(S1, iCol), Cells(S2, iCol)))
   iCol = iCol + 2
   Sheets("Лист2";).Cells(2, iCol + 1).Value = Application.Sum(Sheets("Лист1";).Range(Cells(S1, iCol), Cells(S2, iCol)))
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 VBACool



Вопросов: 1
Ответов: 4
 Профиль | | #2 Добавлено: 31.07.07 21:38
Вот, что было нужно:

Sub WorkMacro1()
   
   S1 = CInt(InputBox("Первая строка диапазона:";))
   S2 = CInt(InputBox("Последняя строка диапазона:";))
   Range(Cells(S1, 1), Cells(S2, 1)).Select
   A1 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)))
   A2 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 1))
   A3 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 2))
   Sheets("Лист2";).Select
   Range("B2";) = A1
   Range("C2";) = A2
   Range(";D2";) = A3
   
End Sub

Спасибо за помощь.

А вот еще вопрос:
Узнали имя текущего листа и присвоили значение переменной N.
N = ActiveSheet.Name
А теперь, если N равно Иванов, то выводим A1, A2, A3 сюда:
   Range("B2";) = A1
   Range("C2";) = A2
   Range(";D2";) = A3

А если N равно Петров, то сюда:
   Range("B3";) = A1
   Range("C3";) = A2
   Range(";D3";) = A3

Как такое сделать? Подскажите пожалуйста.

Ответить

Номер ответа: 3
Автор ответа:
 VBACool



Вопросов: 1
Ответов: 4
 Профиль | | #3 Добавлено: 31.07.07 22:20
Вопрос снимается - разобрался. Вот полный модуль.

Sub WorkMacro1()
   
   N = ActiveSheet.Name
   S1 = CInt(InputBox("Первая строка диапазона:";))
   S2 = CInt(InputBox("Последняя строка диапазона:";))
   Range(Cells(S1, 1), Cells(S2, 1)).Select
   'Range(Cells(S1, 1), Cells(S2, 1)).Activate
   A1 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)))
   'Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 4).Select
   A2 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 1))
   'Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 6).Select
   A3 = Application.Sum(Range(Cells(S1, 1), Cells(S2, 1)).Offset(0, 2))
   
   If N = "Иванов" Then
   
   Sheets("Лист2";).Select
   Range("A2";) = N
   Range("B2";) = A1
   Range("C2";) = A2
   Range(";D2";) = A3
   
   Else
   
   If N = "Петров" Then
   
   Sheets("Лист2";).Select
   Range("A3";) = N
   Range("B3";) = A1
   Range("C3";) = A2
   Range(";D3";) = A3
   
   Else
   
   If N = "Сидоров" Then
   
   Sheets("Лист2";).Select
   Range("A4";) = N
   Range("B4";) = A1
   Range("C4";) = A2
   Range(";D4";) = A3
   
   End If
   End If
   End If
   
End Sub

А как сделать так, чтобы не появлялось окно об ошибке (Run-Time Error '13': Type mismatch), когда жмешь Cancel или закрываешь форму InputBox?

А то пользователь нажмет Debug, вызовет редактор VBA и испугается :)

Ответить

Номер ответа: 4
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #4 Добавлено: 31.07.07 22:50
http://www.vbnet.ru/forum/show.aspx?id=145359

Ответить

Номер ответа: 5
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 82
 Профиль | | #5 Добавлено: 31.07.07 22:54
Зачем вы применяете метод Select в своём макросе?

Range(Cells(S1, 1), Cells(S2, 1)).Select
Sheets("Лист2";).Select

???????

Это замедляет работу вашего макроса и является плохим тоном в программировании под Excel выделять объекты там, где можно обойтись без этого. Попробуйте переписать ваш код без использования метода Select. Если не получится, мы вам поможем. Жду ваших сообщений.

Ответить

Номер ответа: 6
Автор ответа:
 VBACool



Вопросов: 1
Ответов: 4
 Профиль | | #6 Добавлено: 01.08.07 00:17
Range.Select для того, чтобы человек видел, какой он именно диапазон выделил (для контроля так сказать). А Sheet.Select чтобы человек попадал сразу после отработки макроса на лист с результатами.

А вот с окном ошибки не разобрался :(
Нет какой-нибудь простого оператора, чтобы при появлении этого окна - нажал ESC и оно пропало. Было бы хорошо :)
Спасибо.

Ответить

Номер ответа: 7
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #7 Добавлено: 01.08.07 01:00
Универсально_не_особо_здоровый_обход_ошибок:
On Error Resume Next

Ответить

Номер ответа: 8
Автор ответа:
 VBACool



Вопросов: 1
Ответов: 4
 Профиль | | #8 Добавлено: 01.08.07 01:09
On Error Resume Next

Спасибо, пойдет :)
Я думал, что данная строчка - часть цикла и отдельно ее пользовать не получится. А надо было просто попробовать :)

Ответить

Номер ответа: 9
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #9 Добавлено: 01.08.07 03:38
А почему вы не обрабатываете кнопку Cancel? Справка VBA: "...If the user clicks Cancel, the function returns a zero-length string ("";)..."
If InputBox("lkhjl";) = "" Then
    MsgBox "Nothing"
Else
    MsgBox "OK"
End If

Ответить

Номер ответа: 10
Автор ответа:
 shuffle



Администратор

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #10 Добавлено: 01.08.07 17:32
If InputBox("lkhjl";) = "" Then
    MsgBox "Nothing"
Else
    MsgBox "OK"
End If
Это неправильный код, ибо InputBox при нажатии Cancel вернет не "", а vbNullString — это разные вещи. Правильнее будет так:
If strptr(InputBox("lkhjl";)) = 0 Then
    MsgBox "Nothing"
Else
    MsgBox "OK"
End If

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам