Объединение данных в видимых строках в пределах именованного диапазона в строку желаемого формата - PullRequest
0 голосов
/ 03 июня 2019

У меня есть данные 10 x 2 измерения.Данные выглядят следующим образом:

year     rate
05-06     10%
06-07     20.222%
07-08     13.17%
.
.
.

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

Формат строки должен выглядеть следующим образом -

05-06 : 10.0% ; 06-07 : 20.2% ; 07-08 : 13.2% ...

Я сохранил эти данные как именованный диапазон rateCurrent, и я использовал приведенный ниже код для генерации строки видимых строк.

= ConcatenateVisible(rateCurrent, ":", ";")

Пока предположим, что я вставил данные, начиная со столбца 3, строки 8.

Function ConcatenateVisible(rng As Variant, seperator As String, separator1 As String)
    For Each cll In rng
        If cll.EntireRow.Hidden = False And rng.Column = 3 Then
        Debug.Print rng.Row
            ConcatenateVisible = ConcatenateVisible & Format(cll.Value, "@") & seperator
            Debug.Print cll.Value
        Else
        Debug.Print rng.Row
            ConcatenateVisible = ConcatenateVisible & Format(cll.Value, "0.0%") & seperator1
        End If
    Next
    ConcatenateVisible = Left(ConcatenateVisible, Len(ConcatenateVisible) - Len(seperator))
End Function

По какой-то причине второй цикл не работает, и я получаювывод, как показано ниже -

05-06 : 10.00000000000 : 06-07 : 20.2222222222 : 07-08 : 13.1765433333 ....

Я также попробовал функцию ниже, которая при добавлении цикла if для разрывов формата -

Public Function MakeList(ByVal myRange As Range) As String
On Error GoTo Errhand:

    Dim c       As Range
    Dim MyDict  As Object: Set MyDict = CreateObject("Scripting.Dictionary")
    For i = 1 To myRange.Cells.Count
        For Each c In myRange
            If Not Rows(c.Row).Hidden Then
                If Not MyDict.exists(c.Value2) Then MyDict.Add c.Value2, 1
            End If
        Next
        Debug.Print c, MyDict.keys

        If i Mod 2 = 0 Then
            MakeList = Join(MyDict.keys, ": ")
        Else
            MakeList = Join(MyDict.keys, "; ")
        End If
    Next
cleanExit:
    Set MyDict = Nothing
    Set c = Nothing
    Exit Function

Errhand:
    Debug.Print Err.Number, Err.Description
    GoTo cleanExit
End Function

Любые советы или помощь или предложения очень ценятся,ТИА.

1 Ответ

1 голос
/ 03 июня 2019

Попробуйте это:

Option Explicit
Function concatenateVisible(rng As Range, Optional separator As String = " : ", _
    Optional separator1 As String = " ; ") As String

    Dim rw As Range
    Dim str As String

str = ""
For Each rw In rng.Rows
    If rw.Hidden = False And Len(rw.Cells(1, 1)) > 0 Then
        str = str & separator1 & _
            rw.Cells(1, 1) & separator & Format(rw.Cells(1, 2), "0.0%")
    End If
Next rw

concatenateVisible = Mid(str, Len(separator1))

End Function

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...