Можно ли использовать поле ввода, чтобы выбрать строку из таблицы Excel, а затем выбрать указанные c значения ячеек из этой строки, чтобы заполнить оставшуюся часть кода VBA? - PullRequest
0 голосов
/ 10 апреля 2020

Я учусь использовать VBA, чтобы сделать PPT из Excel. Я написал всю функцию, но хотел, чтобы пользователю было проще ее использовать. Итак, я хотел посмотреть, возможно ли это, если я создам поле ввода, в котором пользователь добавляет номер строки, а затем выбирает c ячейки из этой строки, чтобы добавить значения в PPT.

Например, давайте скажем, пользователь поставил «208» в поле ввода, а значения в ячейке B208, I208, J208 используются в функции, как показано ниже.

 ppSlide.Select
    Range("B208").Copy
    ppSlide.Shapes.Paste
    With pppres.Slides(1).Shapes(1)
        .Top = 30
    End With

    ppSlide.Select
    Range("I208").Copy
    ppSlide.Shapes.Paste
    With pppres.Slides(1).Shapes(2)
        .Left = 140
        .Top = 73
    End With

    ppSlide.Select
    Range("J208").Copy
    ppSlide.Shapes.Paste
    With pppres.Slides(1).Shapes(3)
        .Left = 480
        .Top = 73
    End With

Таким образом, вместо изменения значений в 15-16 различных местах пользователь может просто добавить его в поле ввода один раз. и не нужно связываться с кодом.

1 Ответ

1 голос
/ 10 апреля 2020

Я думаю, это то, что вы имеете в виду - более или менее. Пожалуйста, посмотрите.

Sub TestPPslide()

    Dim ppPres As Object                    ' which type of object?
    Dim ppSlide As Object                   ' which data type?
    Dim Inp As Variant
    Dim R As Long

    R = 2
    Do
        Inp = InputBox("Enter a valid row number.", "Slide selector", R)
        ' test if Inp is valid
        If IsNumeric(Inp) Then
            R = Int(Val(Inp))
            If R > 1 And R < 100 Then Exit Do
        Else
            If Len(Inp) = 0 Then Exit Sub       ' user presserd cancel
        End If
    Loop

    SetSlide R, ppSlide, ppPres.Slides(1)
End Sub

Private Function SetSlide(ByVal R As Long, _
                          ppSlide As Object, _
                          PresSlide As Object) As Boolean

    Dim Clm As Variant
    Dim Left As Variant, Top As Variant
    Dim C As Long

    Clm = Array("B", "I", "J")
    Left = Array(0, 140, 480)
    Top = Array(30, 73, 73)

    For C = 0 To UBound(Clm)
        Cells(R, Clm(C)).Copy
        ppSlide.Shapes.Paste
        With PresSlide.Shapes(C + 1)
            .Left = Left(C)
            .Top = Top(C)
        End With
    Next C
End Function

Я не знаю, каковы ваши объекты, из Excel или PP. Поэтому я не могу правильно обрабатывать эти объекты. Или могут быть некоторые несоответствия в вашем собственном коде в их отношении. Возьмите мой код в качестве руководства по настройке.

  1. Создайте Main с подпроцедурами и функциями. Не объединяйте одну мысль за другой в одну процедуру.
  2. Main должен содержать входные данные для задачи. Затем он должен передать задание следующей процедуре, которая в этом случае возвращает два объекта, которые подпрограмма SetSlide изменила для дальнейшего внимания с помощью Main или, возможно, следующей подпрограммы.
  3. Избегать Select или Activate. Вы можете получить доступ к каждой части каждого объекта без таких действий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...