Показать полную графическую версию : Microsoft Excel - общие вопросы
Pliomera
21-08-2009, 16:24
iam_alex, решение на VBA см. в приложенном файле. Выполнение макросов - разрешить в настройках безопасности. Вкратце: в модуль рабочего листа добавить следующий код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 15 And Target.Column = 3 Then
Select Case Cells(15, 3).Value
Case "Период1"
Range(Cells(5, 3), Cells(9, 6)).Sort Range(Cells(5, 4), Cells(9, 4)), xlAscending
Case "Период2"
Range(Cells(5, 3), Cells(9, 6)).Sort Range(Cells(5, 5), Cells(9, 5)), xlAscending
Case "Период3"
Range(Cells(5, 3), Cells(9, 6)).Sort Range(Cells(5, 6), Cells(9, 6)), xlAscending
End Select
Range(Cells(5, 3), Cells(9, 3)).Copy
Range(Cells(16, 3), Cells(20, 3)).PasteSpecial xlPasteValues
Range(Cells(5, 3), Cells(9, 6)).Sort Range(Cells(5, 3), Cells(9, 3)), xlAscending
Target.Activate
End If
End Sub
anatoly_neo
04-09-2009, 17:03
Добрый день. Есть документик в эксель, в нем некоторое множество листов. Нужно, чтобы на первом листе (допустим) в ячейке А1 отображалось содержимое ячейки А1 с одного из листов (второго, третьего и т.д.). Подразумевается что при наличии заполненной ячейки А1 на одном из листов, эту же ячейку на другом листе заполнять не будут!!!
Единственный вариант который пришел в голову это функция "или", но пока не получается ничего, подскажите кто что может?!
PS: в идеале, после создания формулы, первый лист надо вообще запретить редактировать (но при этом данные при редактировании других листов все равно автоматом должны отображаться на первой странице)
Sionnain
04-09-2009, 17:16
=Лист1!A1 Вместо Лист1 подставляете любой лист с ячейкой-источником данных
Pliomera
04-09-2009, 17:44
=Лист1!A1 Вместо Лист1 подставляете любой лист с ячейкой-источником данных »
Насколько я понимаю это не решит проблему. Данные могут быть на любом листе, а отображаться должны на первом. Причем редактировать формулу нельзя. Количество листов заранее видимо тоже не известно.
Я бы решил задачу так: В редакторе VBA в модуль рабочей книги записал следующую процедуру:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Sheets("Лист1").Cells(Target.Row, Target.Column).Value = Target.Value
End Sub
Теперь при любом изменении ячеек на листах, кроме первого листа (имеющего имя Лист1) соответствующие изменения будут отображаться на первом листе.
P.S. Формул на первом листе не будет, только значения.
anatoly_neo
07-09-2009, 11:30
Pliomera Огромное спасибо за помощь, данная штука работает.
можно попросить помочь чуток усовершенствовать?
1) Сделать так чтобы первый лист был заблокирован, но при этом на него могла производиться запись с остальных листов. На данный момент при блокировке листа при заполнении другого листа выскакивает ошибка о том что запись невозможна. может быть можно как то в код забить подстановку пароля?
2) Организовать какую нибудь проверочку на предмет того что определенная ячейка на первом листе заполнена, чтобы эксель выдавал сообщение и просил записать в другую ячейку?
поясню, например я заполнил ячейку А1 на втором листе, она автоматом откопировалась на первый лист, после чего я заполняю ячейку А1 на третьем листе, а эксель говорит мне что ячейка уже занята и предлагает перенести на другую ячейку. что нибудь в этом роде. А то на данный момент он переносит в эту ячейку то что я набираю на следующем листе, с заменой того что там было... это так сказать защита от дурака. :)
1) Сделать так чтобы первый лист был заблокирован, но при этом на него могла производиться запись с остальных листов »
Перед записью на заблокированный лист введите в макрос функцию
ActiveSheet.Unprotect
После записи, соответственно ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Только учтите, лист, с которого снимается защита, должен быть активным. Если вас это не устраивает, замените ActiveSheet на Worksheets("Название листа")
anatoly_neo
07-09-2009, 15:59
спасибо местным гуру за огромную помощь. осталось только второй пунктик про проверку забацать и усе :)
Как-то так
Private Sub Worksheet_Change(ByVal Target As Range)
For Each c In Worksheets(1).Range(1, 100)
If c = "" Then c = Target.Value: Exit For
Next
End Sub
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC