Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | Графика


Rambler's Top100


Counter CO.KZ


    [1] [2] [3]

  1. Как сохранить любой рисунок в виде графического файла ? 17.06.2016
  2. Как программно импортировать нужный рисунок ? 07.10.2007
  3. Как импортировать нужный рисунок из интернета ? 20.05.2016
  4. Как импортировать все(или только определённого типа) картинки из выбранной папки ? 01.11.2014
  5. Как автоматически вставлять картинки, скопированные в буфер обмена со страниц в интернете ? NEW 06.11.2017
  6. Как определить ячейки, к которым привязан графический об'ект ? 08.04.2011
  7. Как определить "пересекаются" или нет графические об'екты с конкретным диапазоном ? 09.05.2016
  8. Как создать копию графического об'екта и разместить его в нужном месте рабочего листа ? 24.05.2008
  9. Как скопировать формат одного графического об'екта и применить его к другим об'ектам (тиражирование формата) ? 24.06.2008
  10. Как удалить все графические об'екты в рабочем листе [без цикла] ? 24.09.2006
  11. Как назначить макрос всем графическим об'ектам одного типа [без цикла] ? NEW 15.10.2017
  12. Как перебрать все графические об'екты расположенные в нужном рабочем листе ? 26.02.2007
  13. Как перебрать в цикле только OLEObject ? 26.02.2007
  14. Как узнать имя Shape вызвавшего макрос ? 26.01.2007
  15. Как определить принадлежность Shape к группе ? 26.01.2007
  16. Как менять цвет заливки автофигуры в зависимости от данных ячейки ? 17.12.2006
  17. Как менять цвет заливки автофигуры в зависимости от дня недели ? 21.06.2007
  18. Как создать всплывающую подсказку для графических об'ектов ? 05.05.2007
  19. Как создать всплывающие подсказки для нужных ячеек ? 03.07.2007
    [1] [2] [3]


  • Ответ : Актуально для MS Excel 2000, XP, 2003

    Если Вы хотите сохранить любой рисунок в виде графического файла, то можно просто определить диапазон, с которым "связан" этот рисунок, и сохранить этот диапазон в виде .html файла. В таком случае, у нас появится доп.папка, содержащая нужный графический рисунок. Если графических файлов будет несколько, то можно будет выбрать файл с наибольшим размером. Причём, осуществить сие действие, можно также с помощью VBA.
  • Private Sub SavePictureInHTML() 'Microsoft Excel 2000, XP, 2003
        Dim iList As Worksheet, iPicture As Picture, iAddress$, iFileName$
        
        Set iList = ActiveWorkbook.Worksheets(1) 'ActiveSheet
        Set iPicture = iList.Pictures(1)
    
        iAddress = iList.Range(iPicture.TopLeftCell, _
        iPicture.BottomRightCell).Address(, , Application.ReferenceStyle)
        iFileName = ActiveWorkbook.Path & "\Picture.html"
    
        With ActiveWorkbook.PublishObjects.Add( _
             xlSourceRange, iFileName, iList.Name, iAddress, xlHtmlStatic)
             .Publish True: .Delete
        End With
        
        ActiveWorkbook.FollowHyperlink Replace(iFileName, ".html", ".files")
    End Sub
    Особенности Microsoft Excel 2007

    В этой версии публикация также возможна, однако, как правило, получить файл, полностью идентичный(размер, расширение), тому, который был импортирован, не получается.
  • Ответ :

    Вариант I.
  • iFilePicture$ = "C:\MyPicture.gif"

    Worksheets(1).Pictures.Insert FileName:=iFilePicture$
    Если необходимо сразу указать нужное месторасположение созданной картинки, а также изменить её размер, то в этом случае, можно воспользоваться свойствами об'екта Picture, например :
    With Worksheets(1).Pictures.Insert(FileName:=iFilePicture$)
         .Top = 50
         .Left = 100
         '.Width = 25
         '.Height = 25
    End With
    Вариант II.
    iFilePicture$ = "C:\MyPicture.jpg"

    Worksheets(1).Shapes.AddPicture _
    FileName:=iFilePicture$, LinkToFile:=False, _
    SaveWithDocument:=True, Left:=100, Top:=50, Width:=25, Height:=25
    Комментарий :
  • cемейство Shapes появилось только в MS Excel 97, поэтому, в MS Excel 95 необходимо использовать первый вариант.
  • первый вариант нельзя использовать, если рабочий лист защищён, т.к. в этом случае Вы получите ошибку. Впрочем, вставить рисунок всё-таки можно, но для этого необходимо, либо снять защиту листу, либо использовать этот совет [FAQ42]
  • второй вариант нельзя использовать, только если рабочий лист защищён в отношении об'ектов.
  • все аргументы метода AddPicture являются обязательными, т.е. при импорте рисунка Вы обязаны указать не только полное имя файла, но и месторасположение картинки, а также её размеры.
    Актуально для MS Excel 2000, XP
    Если же, при вставке картинки, её размеры менять не нужно, то просто укажите ширину и высоту = -1, т.е. Width:=-1, Height:=-1
  • импортировать можно не только файлы с расширением .gif, .jpg, но и .bmp, .png, .wmf и проч.
  • не забывайте перед импортом проверять наличие указанного файла [FAQ44]
  • Ответ :

    Для того, чтобы программно испортировать нужный рисунок из сети интернет, можно использовать любой из двух вышеопубликованных вариантов [FAQ389], только вместо файла, находящегося на диске, укажите реально существующий URL картинки, например :
  • iFilePicture$ = "http://www.msoffice-nm.ru/cat42.jpeg"
  • Ответ :

    Для того, чтобы скопированный в буфер обмена рисунок из интернета, был автоматически вставлен в определённый рабочий лист, запустите макрос StartMacro, а когда необходимость в грабеже картинок исчезнет, соответственно макрос StopMacro
  • 'Необходима следующая ссылка Microsoft Forms 2.0 Object Library
    
    Public iTimer As Date, iTop!
    Public iClipboard As New MSForms.DataObject
    
    Public Sub StartMacro()
        'Лист1.Pictures.Delete
        CopyPictureFromClipboard
    End Sub
    
    Public Sub CopyPictureFromClipboard()
        If Application.ClipboardFormats(1) = xlClipboardFormatBitmap Then
           With Лист1.Pictures.Paste
                .Left = 0: .Top = iTop
                iTop = iTop + .Height
           End With
           iClipboard.SetText "", 1
           iClipboard.PutInClipboard
        End If
        iTimer = DateAdd("s", 3, Now)
        Application.OnTime iTimer, "CopyPictureFromClipboard"
    End Sub
    
    Public Sub StopMacro()
        On Error Resume Next
        Application.OnTime iTimer, "CopyPictureFromClipboard", , False
    End Sub
    Комментарий :
  • Вместо кодового(программного) имени Лист1 , которое используется в данном примере, Вам необходимо указать свой рабочий лист.
  • В данном примере, содержимое буфера обмена проверяется с периодичность в три секунды, если Вы не собираетесь копировать картинки со страничек в интернете с такой скоростью, то интервал можно увеличить.
  • Ответ :

    Для того, чтобы определить верхнюю левую и нижнию правую ячейку, к которым "привязан" определённый графический об'ект, можно использовать свойства TopLeftCell и BottomRightCell, которые возвращают об'ект Range :
  • iLeft = Worksheets(1).DrawingObjects(1).TopLeftCell.Address
    iRight = Worksheets(1).DrawingObjects(1).BottomRightCell.Address
    iLeft = Worksheets(1).Shapes(1).TopLeftCell.Address
    iRight = Worksheets(1).Shapes(1).BottomRightCell.Address
    With Worksheets(1).Shapes(1)
         MsgBox Range(.TopLeftCell, .BottomRightCell).Address
    End With
    Dim iShape As Shape, iLeft As Range, iRight As Range

    Set iShape = Worksheets(1).Shapes(1)
    Set iLeft = iShape.TopLeftCell
    Set iRight = iShape.BottomRightCell

  • Ответ :
  • Private Sub IntersectGraphAndRange()
        Dim iList As Worksheet
        Dim iSource As Range
        Dim iGraph As Object, iCount&
        
        Set iList = Worksheets(1)        'Лист1
        Set iSource = iList.Range("C:C") 'Лист1.[C:C]
        
        For iCount = 1 To iList.DrawingObjects.Count
            Set iGraph = iList.DrawingObjects(iCount)
            
            If Not Intersect(iSource, iList.Range( _
            iGraph.TopLeftCell, iGraph.BottomRightCell)) Is Nothing Then
               MsgBox "Пересеклись", , iGraph.Name
            End If
        Next
    End Sub
    Комментарий :
  • в MS Excel 97 уже можно использовать cемейство Shapes. Однако необходимо помнить, что Shapes, в отличии от DrawingObjects, включает в себя также комментарии и выпадающий список автофильтра, проверки данных и сводной таблицы. A наличие такого выпадающего списка - приведёт к возникновению ошибки, ибо у этого об'екта отсутствуют свойства TopLeftCell и BottomRightCell
  • при переборе элементов семейства DrawingObjects не рекомендую использовать цикл For Each , т.к. в этом случае будут "потеряны" графические элементы некоторых типов.
  • Ответ :

    Для того, чтобы создать копию нужного графического об'екта и сразу указать нужное месторасположение созданной графики, можно воспользовавшись методом Copy скопировать исходный об'ект в буфер обмена, а затем, вставить его используя метод Paste об'екта Worksheet и необязательный именованный аргумент Destination, например :

    Вариант I.
  • With ThisWorkbook.Worksheets(1)
         .Shapes(1).Copy
         .Paste Destination:=.Range("C3")
    End With
    Кроме этого, Вы можете создать копию использовав метод Duplicate, а затем, просто изменить месторасположение копии, воспользоваться свойствами этого об'екта, например :

    Вариант II.
    With ThisWorkbook.Worksheets(1)
         Dim iShape As Shape
         Set iShape = .Shapes(1).Duplicate
         iShape.Top = .Range("C3").Top
         iShape.Left = .Range("C3").Left
    End With
    With ThisWorkbook.Worksheets(1)
         Dim iDestination As Range
         Set iDestination = .Range("C3")
         With .Shapes(1).Duplicate
              .Top =  iDestination.Top
              .Left = iDestination.Left
         End With
    End With
    Комментарий :
  • cемейство Shapes появилось только в MS Excel 97, поэтому, в MS Excel 95 необходимо использовать либо общее семейство DrawingObjects, либо более конкретное, например, Buttons и т.п.
  • оба варианта нельзя использовать, если рабочий лист защищён в отношении об'ектов, т.к. в этом случае Вы получите ошибку. Впрочем, создать копию всё-таки можно, но для этого необходимо, либо снять защиту листу, либо использовать этот совет [FAQ42]
  • если в первом рабочем листе текущей рабочей книги не будет графического об'екта, то любая попытка создать копию, неизменно приведёт к ошибке, которую можно избежать, если предварительно проверить наличие Shape с нужным именем/индексом
  • первый вариант удобен для создания копии в другом рабочем листе
  • последний пример из второго варианта имеет смысл использовать, если Вы собираетесь воспользоваться и другими свойствами и/или методами созданного об'екта и не хотите лишний раз дёргать его (так как это сделано в первом примере)
  • Ответ :

    Для того, чтобы скопировать формат нужного графического об'екта нужно использовать метод PickUp, а для того, чтобы применить его необходимо использовать метод Apply
    Для примера, ниже приведены два варианта, позволяющие скопировать формат первого графического об'екта и применить его ко всем остальным об'ектам активного рабочего листа.

    Вариант I.
  • With ActiveSheet.Shapes
         Select Case .Count
             Case 0: MsgBox "На нет и суда нет", , ""
             Case 1: MsgBox "Хотелось бы побольше графики", , ""
             Case Else: .Item(1).PickUp
             For iCount& = 2 To .Count
                 .Item(iCount&).Apply '
             Next
         End Select
    End With
    Вариант II.
    With ActiveSheet.DrawingObjects
         Select Case .Count
             Case 0: MsgBox "На нет и суда нет", , ""
             Case 1: MsgBox "Хотелось бы побольше графики", , ""
             Case Else: .Item(1).ShapeRange.PickUp
             For iCount& = 2 To .Count
                 .Item(iCount&).ShapeRange.Apply '
             Next
         End Select
    End With

  • Ответ : Скачать пример
  • If Not Worksheets(1).ProtectDrawingObjects Then
       Worksheets(1).DrawingObjects.Delete
    Else
       MsgBox "Удалить сразу все графические об'екты, по всей видимости, нельзя"
    End If
    Примечание : Когда рабочий лист защищён в отношении об'ектов, то удалить сразу все графические об'екты можно только при условии, что все они незащищены, что вряд ли ... ведь защищать лист в отношении об'ектов, без защиты самих об'ектов - не имеет смысла.
  • Ответ :

    Для того, чтобы назначить один и тот же макрос всем однотипным графическим об'ектам, можно использовать такой синтаксис :
  • ActiveSheet.Buttons.OnAction = "Макрос1"
    ActiveSheet.Ovals.OnAction = "Макрос2"
    ActiveSheet.Rectangles.OnAction = "Макрос3"
    Примечание : Когда рабочий лист защищён в отношении об'ектов, то назначить всем графическим об'ектам, макрос, можно только при соблюдение одного из условий :

    1) Все графические об'екты, которым мы должны назначить макрос, незащищены. Если же часть об'ектов будет защищена, а часть нет, то ошибки не возникнет, но макрос будет назначен только незащищённым об'ектам
    2) Либо, при защите листа, пользователям было разрешено - изменение об'ектов Excel XP (и старше)

    Особенности Microsoft Excel 2007

  • В этой, и последующих версиях, при попытке назначить макрос несуществующим графическим об'ектам возникнет ошибка 1004. Чтобы избежать этой ошибки, достаточно предварительно просто проверить их наличие, т.е.
  • With ActiveSheet.Buttons
         If .Count > 0 Then .OnAction = "Макрос1"
    End With
    или
    If ActiveSheet.Buttons.Count > 0 Then ActiveSheet.Buttons.OnAction = "Макрос1"

  • Ответ :

    Для того, чтобы перебрать все графические об'екты, в т.ч. и OLEObject можно использовать любой из представленных вариантов.

    Вариант I.
  • For iCount = 1 To Worksheets(1).DrawingObjects.Count
        MsgBox Worksheets(1).DrawingObjects(iCount).Name
    Next

    With Worksheets(1).DrawingObjects
         For iCount = 1 To .Count
             MsgBox .Item(iCount).Name
         Next
    End With
    Вариант II.
    Dim iShape As Shape
    For Each iShape In Worksheets(1).Shapes
        MsgBox iShape.Name
    Next
    For iCount = 1 To Worksheets(1).Shapes.Count
        MsgBox Worksheets(1).Shapes(iCount).Name
    Next
    With Worksheets(1).Shapes
         For iCount = 1 To .Count
             MsgBox .Item(iCount).Name
         Next
    End With
    Комментарий :
  • cемейство Shapes появилось только в MS Excel 97, поэтому, в MS Excel 95 необходимо использовать первый вариант.
  • cемейство Shapes, в отличии от DrawingObjects, включает в себя также комментарии, а также выпадающий список автофильтра, проверки данных и сводной таблицы.
  • Ответ :

    Вариант I.
  • Dim iOLEObject As OLEObject
    For Each iOLEObject In Worksheets(1).OLEObjects
        MsgBox iOLEObject.Name
    Next
    Вариант II.
    For iCount = 1 To Worksheets(1).OLEObjects.Count
        MsgBox Worksheets(1).OLEObjects(iCount).Name
    Next
    With Worksheets(1).OLEObjects
         For iCount = 1 To .Count
             MsgBox .Item(iCount).Name
         Next
    End With

  • Ответ : Скачать пример
  • iShapeName = Application.Caller

    MsgBox "Вы только что кликнули : " & iShapeName
    Комментарий : Данный способ не применим к OleObjects, например, ActiveX элементам управления с панели инструментов Элементы управления.
  • Ответ : Скачать пример
  • If Worksheets(1).Shapes(1).Type = msoGroup Then
       MsgBox "Данный об'ект является группой"
    Else
       MsgBox "Данный об'ект не является группированным об'ектом"
    End If
    Bonus : Небольшой пример перебора всех графических об'ектов (в т.ч. и диаграмм) в первом рабочем листе активной рабочей книги, с последующим определением является ли об'ект группой. При наличии группированного об'екта Вы сможете узнать, что именно входит в состав этого об'екта.
    Private Sub AllShapesInWorksheet()
    
    Dim iShape As Shape, iItem As Shape
    
    For Each iShape In Worksheets(1).Shapes
        If iShape.Type = msoGroup Then
           If MsgBox("Об'ект «" & iShape.Name & "» является группой" & vbCrLf & _
              "Хотите посмотреть все об'екты этой группы ?", vbYesNo, "") = vbYes Then
              For Each iItem In iShape.GroupItems
                  iGroupItems$ = iGroupItems$ & vbCrLf & iItem.Name
              Next
              MsgBox "Список всех об'ектов : " & iGroupItems$, , ""
              iGroupItems$ = ""
           End If
        Else
           MsgBox "Об'ект «" & iShape.Name & "» не является группой", , ""
        End If
    Next
    
    End Sub
    Private Sub AllDrawingObjectsInWorksheet()
    
    With Worksheets(1).DrawingObjects
         Dim iItem As Object
         For iCount& = 1 To .Count
             If .Item(iCount&).ShapeRange.Type = msoGroup Then
                If MsgBox("Об'ект «" & .Item(iCount&).Name & "» является группой" & _
                   vbCrLf & "Хотите посмотреть все об'екты этой группы ?", _
                   vbYesNo, "") = vbYes Then
                   For Each iItem In .Item(iCount&).ShapeRange.GroupItems
                       iGroupItems$ = iGroupItems$ & vbCrLf & iItem.Name
                   Next
                   MsgBox "Список всех об'ектов : " & iGroupItems$, , ""
                   iGroupItems$ = ""
                End If
             Else
                MsgBox "Об'ект «" & .Item(iCount&).Name & "» не является группой", , ""
             End If
         Next
    End With
    
    End Sub

  • Ответ : Скачать пример Актуально для MS Excel 97, 2000, XP

    Для автоматического изменения заливки, после изменения данных в нужной ячейки (в данном примере, используется ввод числовых значений) можно воспользоваться событием рабочего листа Worksheet_Change, которое необходимо разместить в модуле рабочего листа, где находится автофигура. А для изменения цвета заливки, можно использовать свойство RGB.
  • Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        If Not Intersect(Target, [B2]) Is Nothing Then
           If IsNumeric([B2]) = True Then
              Select Case [B2]
                  Case 1 To 100:    iColor& = vbRed
                  Case 100 To 200:  iColor& = vbBlue
                  Case 200 To 300:  iColor& = vbCyan
                  Case 300 To 400:  iColor& = vbGreen
                  Case 400 To 500:  iColor& = vbYellow
                  Case 500 To 1000: iColor& = vbMagenta
                  Case Else:        iColor& = vbWhite
              End Select
              Me.Shapes(1).Fill.ForeColor.RGB = iColor&
           End If
        End If
    End Sub
    Комментарий : Вместо констант допускается использования функции RGB, например, RGB(50, 0, 100)

    Для изменения цвета заливки, также можно использовать свойство SchemeColor.
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        If Not Intersect(Target, [B2]) Is Nothing Then
           If IsNumeric([B2]) = True Then
              Select Case [B2]
                  Case 1 To 100:    iColor% = 10
                  Case 100 To 200:  iColor% = 12
                  Case 200 To 300:  iColor% = 46
                  Case 300 To 400:  iColor% = 17
                  Case 400 To 500:  iColor% = 34
                  Case 500 To 1000: iColor% = 22
                  Case Else:        iColor% = 65
              End Select
              Me.Shapes(1).Fill.ForeColor.SchemeColor = iColor%
           End If
        End If
    End Sub

  • Ответ : Актуально для MS Excel 97, 2000, XP

    Для автоматического изменения заливки, сразу после активации листа, можно воспользоваться событием рабочего листа Worksheet_Activate, которое необходимо разместить в модуле рабочего листа, где находится автофигура. А для изменения цвета заливки, можно использовать свойство SchemeColor или RGB.
    Цвета, соответствующие дням недели, выбраны исключительно в качестве примера и могут быть изменены.
  • Private Sub Worksheet_Activate()
        Me.Shapes(1).Fill.ForeColor.SchemeColor = _
        Choose(WeekDay(Now, vbMonday), 26, 47, 42, 41, 22, 16, 10)
    End Sub
    Private Sub Worksheet_Activate()
        Me.Shapes(1).Fill.ForeColor.RGB = Choose(WeekDay(Now, _
        vbMonday), 13434879, 10079487, 13434828, 16711680, 16777164, 128, 255)
    End Sub
    Option Base 1

    Private Sub Worksheet_Activate()
        Me.Shapes(1).Fill.ForeColor.SchemeColor = _
        Array(26, 47, 42, 11, 22, 16, 10)(WeekDay(Now, vbMonday))
    End Sub
    Private Sub Worksheet_Activate()
        Me.Shapes(1).Fill.ForeColor.RGB = Array(13434879, 10079487, _
        13434828, 16711680, 16777164, 128, 255)(WeekDay(Now, vbMonday) - 1)
    End Sub
    Примечание : Вместо события Worksheet_Activate() можно использовать макросы, которые выполняются при открытии рабочей книги [FAQ61] Однако, в этом случае, ключевое слово Me необходимо заменить ссылкой на нужный рабочий лист.
  • Ответ : Скачать пример Актуально для MS Excel 97, 2000, XP

    1. Создайте графический файл, содержащий изображение графического об'екта, для которого Вы хотите создать всплывающую подсказку. (Если подсказку изначально предполагается создавать для ActiveX элементов управления, то этот пункт можно пропустить)
    2. В меню Вид выберите пункт Панели инструментов и команду Элементы управления. Теперь нажмите кнопку, например, Рисунок (Image) или Надпись (Label) и разместите выбранный элемент управления в нужном месте рабочего листа, при необходимости изменив его размер.
    3. Кликните правой кнопкой мышки и в контекстном меню выберите команду Свойства, затем кликните мышкой небольшую серую кнопку в левой части поля Picture и выберите предварительно созданный графический файл (пункт#1)
    После чего, измените свойства выбранного элемента управления в соответствии с Вашими требованиями. В итоге, Вы должны получить имитацию нужного графического об'екта. (Если подсказку изначально предполагается создавать для ActiveX элементов управления, то этот пункт также можно пропустить)
    4. Нажмите на кнопку Выход из режима конструктора, которая расположена на панели инструментов Элементы управления.
    5. Теперь, в меню Вид выберите пункт Панели инструментов и команду Рисование и выберите нужную фигуру, которая и станет Вашей подсказкой. Разместите выбранный об'ект недалеко от имитации (пункт#3), при необходимости изменив его размер, добавив текст и т.д. и т.п.
    6. Разместите этот код только в модуле книги ThisWorkbook/ЭтаКнига :
  • Private Sub Workbook_Open()
        Application.Run "Restore_UnVisible"
    End Sub
    Этот код разместите в модуле рабочего листа, где находится ActiveX элемент управления :
    Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If iFlag = False Then
           iFlag = True 'iFlag = Not iFlag
           Me.Rectangles(1).Visible = msoTrue
           Application.OnTime EarliestTime:=DateAdd("s", 1, Now), Procedure:="Restore_UnVisible"
        End If
    End Sub

    Private Sub Worksheet_Activate()
        Application.Run "Restore_UnVisible"
    End Sub
    А затем, разместите в любом стандартном модуле, следующий код :
    Public iFlag As Boolean

    Private Sub Restore_UnVisible()
        iFlag = False
        Лист1.Rectangles(1).Visible = msoFalse
    End Sub
    7. Сохраните все внесённые изменения.

    Примечание :
  • В этом примере, в качестве всплывающей подсказки, используется фигура Прямоугольник с панели инструментов Рисование.
  • В этом примере, подсказка скрывается через одну секунду, но Вы можете откорректировать/изменить это время в соответствии со своими требованиями.
  • Использование стандартного модуля, равно как и кодового (программного) имени листа Лист1, не является обязательным условием.
  • Скрытие подсказки, при открытии и активации рабочего листа, также не является обязательным условием, поэтому, Вы можете скрыть свою подсказку программно и удалить/закомментировать эти события.
  • Если существует вероятность удаления подсказки, в т.ч. и случайной, то перед отображением/скрытием имеет смысл проверить её наличие.
    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

  • © 2004-2017 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff