Как повторить код макроса для фиксированного количества строк в Excel?

Я совершенно новичок в макросах и VB, поэтому был бы признателен за любую помощь. У меня есть данные excel в этой форме:

Clip    PSNR-codec1     PSNR-codec2     Bit Rates 
Video1  29.426086       29.220891       94357
Video1  31.207342       31.703124       322832
Video1  34.474587       34.255598       633468
Video1  36.445279       35.479189       936961
Video1  39.093937       36.4768         1539093
Video2  41.156012       37.295318       326742
Video2  43.355358       37.684239       604494
Video2  29.95337        29.30644        1218206
Video2  32.040252       30.837518       1809751
Video2  34.194409       32.774954       2387549
Video3  35.495356       33.806537       1567065
Video3  36.395173       34.544676       2173151
Video3  37.077718       35.234943       3094348
Video3  35.681498       36.036972       3240981
Video3  171.661771      83.104314       3355959
Video4  171.247791      96.978608       5103370
Video4  185.239286      128.064048      6636778
Video4  189.115735      115.418461      8150015
Video4  185.35225       154.3189011     2345629

Мое требование состоит в том, чтобы создать диаграмму типа "XYScatterSmooth" на отдельном листе для каждого видео. График должен иметь битрейт по оси X и PSNR по оси Y. В дальнейшем у нас будут данные и для других видео. Итак, как мне написать макрос, который будет повторять эти шаги для каждого видео (т.е. цикл должен повторяться для каждых 5 строк. 5 строк данных — это фиксированное число)

Версия Excel: 2010


person PerlDev5    schedule 09.10.2012    source источник


Ответы (1)


Это сработало для меня с предоставленными вами образцами данных.

Поместите все свои данные на первый лист, удалите все остальные листы. Ваши данные должны начинаться со строки 2 (как указано выше). Макрос спросит вас об общем количестве видео (мне это проще, чем зацикливаться до пустой ячейки), а затем создаст диаграммы на новом листе. Он называет листы Video1, Video2 и т. д.

Дайте мне знать, если это сработает для вас.

Private Sub BitRateCharts()

' Data should be on Sheet 1. Delete all other sheets.


    Dim nVideoNum As Integer
    nVideoNum = 1

    Dim n As Integer
    n = 1

    Dim nStart As Integer
    nStart = 2

    Dim nLast As Integer
    nLast = 6

    Dim nVideos As Integer
    nVideos = InputBox("How many videos?")

    Dim nSheetNum
    nSheetNum = ActiveSheet.Index

    Do Until n > nVideos

    nSheetNum = ActiveSheet.Index
        If nSheetNum = ThisWorkbook.Sheets.Count Then
            Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Video" & nVideoNum
        Else
        End If

            ActiveSheet.Shapes.AddChart.Select
            ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
            ActiveChart.SetSourceData Source:=Range("Sheet1!$B$" & nStart & ":$D$" & nLast & "")
            ActiveChart.SeriesCollection(1).XValues = "=Sheet1!$D$" & nStart & ":$D$" & nLast & ""
            ActiveChart.SeriesCollection(1).Values = "=Sheet1!$B$" & nStart & ":$B$" & nLast & ""
            ActiveChart.SeriesCollection(2).XValues = "=Sheet1!$D$" & nStart & ":$D$" & nLast & ""
            ActiveChart.SeriesCollection(2).Values = "=Sheet1!$C$" & nStart & ":$C$" & nLast & ""
            ActiveChart.SeriesCollection(1).Name = "=""PSNR-Codec1"""
            ActiveChart.SeriesCollection(2).Name = "=""PSNR-codec2"""

            n = n + 1

            nVideoNum = nVideoNum + 1

            nStart = nStart + 5
            nLast = nLast + 5
    Loop

    MsgBox ("Macro Complete.")

Exit Sub

ErrMsg:

    MsgBox ("Error encountered. Macro could not complete.")


End Sub
person tmoore82    schedule 10.10.2012
comment
Был еще вопрос: в приведенном выше случае я знаю имя первого листа - «Лист1». Но теперь я пишу более общий код, в котором я не знаю имени первого листа, поэтому я получаю его с помощью макроса Name1 = ActiveWorkbook.Worksheets(1).Name. Тогда как мне использовать переменную Name1 в оператор цикла ActiveChart.SetSourceData Source:=Range(Sheet1!$B$ & nStart & :$D$ & nLast & ) для выбора диапазона? - person PerlDev5; 15.10.2012
comment
Я не тестировал его, но он должен просто заменить Sheet1. Таким образом, это должно выглядеть так: ActiveChart.SetSourceData Source:=Range( & Name1 & !$B$ & nStart & :$D$ & nLast & ) - person tmoore82; 16.10.2012