VBA для цикла, использующего целое число счетчика для извлечения контента из ячеек - PullRequest
0 голосов
/ 10 сентября 2018

Я действительно начинающий с макросами VBA и их синтаксисом, так что терпите меня, пожалуйста. Я пытался назначить контент из определенных ячеек на метки в точечной диаграмме. Начал с записи моего собственного ручного задания и «очистки» этого кода. Прекрасно работает для набора образцов, который я сейчас использую.

Sub Rename_scatter()
'
' Rename_scatter Macro
'
'
    ActiveSheet.ChartObjects("Risikomatrix").Activate
    ActiveChart.FullSeriesCollection(1).DataLabels.Select

    ActiveChart.FullSeriesCollection(1).Points(1).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(1).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(1).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "='Risiko-Log'!$B$2", 1

    ActiveChart.FullSeriesCollection(1).Points(2).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(2).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(2).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "='Risiko-Log'!$B$3", 1

    ActiveChart.FullSeriesCollection(1).Points(3).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(3).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(3).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "='Risiko-Log'!$B$4", 1

    ActiveChart.FullSeriesCollection(1).Points(4).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(4).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(4).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "='Risiko-Log'!$B$5", 1

    ActiveChart.FullSeriesCollection(1).Points(5).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(5).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(5).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "='Risiko-Log'!$B$6", 1

End Sub

Очевидно, что это не очень эффективно, поэтому я хотел бы воссоздать подход в цикле for, выбирая каждую ссылочную ячейку с помощью счетчика i (Points и DataLabels будут использовать i, а спецификация индекса или ячейки будет использовать i +1).

Некоторое время я пробовал несколько разных подходов, но, похоже, не могу понять синтаксис правильно. У кого-нибудь есть идея, которая поможет мне пройти через это и восстановить мою мотивацию? Любая помощь приветствуется! Вот где я сейчас нахожусь:

    Sub Rename_scat()
'
' Rename_scat Macro
'
'
    Dim i As Integer

    Dim LastRow As Integer
    LastRow = Range("'Risiko-Log'!A" & Rows.Count).End(xlUp).Row


    For i = 1 To LastRow
    ActiveSheet.ChartObjects("Risikomatrix").Activate
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    ActiveChart.FullSeriesCollection(1).Points(i).DataLabel.Select
      ActiveChart.SeriesCollection(1).DataLabels(i).Format.TextFrame2.TextRange. _
        Characters.Text = ""
      ActiveChart.SeriesCollection(1).DataLabels(i).Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldFormula, "'Risiko-Log'!.Cells(i + 1, 2)", 1
    Next i

End Sub

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Продолжал бороться с For-Loop, но только что удалось решить все проблемы, используя «Пока».

Sub Rename_scat()
'
' Rename_scat Macro
'
'
    Dim i As Integer
    i = 2
    While IsEmpty("'Risiko-Log'!.Cells(" & i & ",1).Value")
        ActiveSheet.ChartObjects("Risikomatrix").Activate
        ActiveChart.FullSeriesCollection(1).DataLabels.Select
        ActiveChart.FullSeriesCollection(1).Points(i - 1).DataLabel.Select
        ActiveChart.SeriesCollection(1).DataLabels(i - 1).Format.TextFrame2.TextRange. _
            Characters.Text = ""
        ActiveChart.SeriesCollection(1).DataLabels(i - 1).Format.TextFrame2.TextRange. _
            InsertChartField msoChartFieldFormula, "'Risiko-Log'!.Cells(" & i & ", 2)", 1
        i = i + 1
    Wend

End Sub

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

Спасибо за вашу помощь и вклад @Harassed Dad!

0 голосов
/ 10 сентября 2018

в

 ActiveChart.SeriesCollection(1).DataLabels(i).Format.TextFrame2.TextRange. _
    InsertChartField msoChartFieldFormula, "'Risiko-Log'!.Cells(i + 1, 2)", 1

Вы заключаете i + 1 в речевые метки, чтобы он воспринимался как строка. Вам нужно, чтобы это был расчет, поэтому он должен быть за пределами речевых меток. Используйте

ActiveChart.SeriesCollection(1).DataLabels(i).Format.TextFrame2.TextRange. _
    InsertChartField msoChartFieldFormula, "'Risiko-Log'!.Cells(" & i + 1 & ", 2)", 1
...