Vba для цикла с использованием целого числа счетчика для извлечения содержимого из ячеек

Я действительно новичок в макросах 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 (точки и метки данных будут использовать 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
1
0
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

в

 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

Привет! Спасибо, что заглянули. Для меня это имеет смысл ... Я заменил фрагмент кода, но, к сожалению, все еще получаю сообщение «Указанный параметр имеет недопустимое значение». сообщение об ошибке для тех же строк. Есть идеи, где я ошибся?

T. Buc 10.09.2018 12:16

DataLabels (i) - в VBA большинство индексов начинаются с 0, но номера строк начинаются с 1, поэтому вам нужны DataLabels (i-1), я думаю - в конце вашего цикла вы пытаетесь получить доступ к несуществующему номеру индекса

Harassed Dad 10.09.2018 13:03
Ответ принят как подходящий

Продолжал бороться с For-Loop, но смог решить все проблемы с помощью «While».

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!

Другие вопросы по теме