Новый с VBA :) - PullRequest
       12

Новый с VBA :)

0 голосов
/ 28 января 2019

Мне нужна ваша помощь с кодом VBA, который я написал несколько дней назад и который мне не удается заставить его работать.Подводя итог, у меня есть файл «export.prn», из которого мне нужно извлечь данные, чтобы скопировать их в строку в другой файл Excel на конкретном листе.Когда мои данные в строке, я должен скопировать эту строку и перенести ее в столбец на другом листе.Затем в этом столбце (последнем) мне нужно применить формулу ТОЛЬКО к непустым ячейкам (за исключением тех, которые говорят «Uncalib»), чтобы новое значение заменяло старое.Затем для каждой ячейки с формулой (непустые) мне нужно отобразить ее абсолютное значение в ячейке справа (например: C1 = -21; D1 = 21).Наконец, для последнего столбца (с абсолютными значениями) я должен применить правило условного форматирования.Итак, в конце у меня есть 2 столбца (не абсолютный и абсолютный с CF), и ячейки, которые были пустыми в начале, все равно будут пустыми в конце.Кроме того, каждый раз, когда я запускаю этот код, данные должны находиться в следующей строке / столбце, чтобы они не удаляли предыдущие данные (поэтому для каждого цикла будет создаваться 1 строка в столбцах Sheet1 и 2 столбца в Sheet2)

Я очень новичок в VBA и пытался что-то сделать, но, похоже, он не работает должным образом, особенно со строкой в ​​конце: If WsZscore.Cells(i, LastCol).Value = "" Then, и я не знаю почему (так какограниченные знания такого рода вещей ^^).Мой код, вероятно, слишком длинный для того, что я пытаюсь сделать, но мне не удается сделать его короче: /

Спасибо :))

Sub TM()

Application.ScreenUpdating = False

Réponse = MsgBox("Voulez vous importer les données ?", vbYesNo)
    If Réponse <> vbYes Then Exit Sub

Dim i As Long
Dim j As Long
Dim l As Long


Dim WsCartes As Worksheet
Dim WsDonnées As Worksheet
Dim WsOrigine As Worksheet

'Set my workbooks and sheets
Set WsCartes = Workbooks("Classeur1.xlsm").Worksheets("cartes")
Set WsDonnées = Workbooks("Classeur1.xlsm").Worksheets("TM")
Set WsOrigine = Workbooks("export2.prn").Worksheets("export2")
Set WsZscore = Workbooks("Classeur1.xlsm").Worksheets("ZscoreTM")


i = 2
l = 4

WsCartes.Range("D5").Value = WsOrigine.Range("J4").Value

'Import my data from the export.prn file
While WsOrigine.Cells(l, 2).Value <> ""

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Be9*" Then

        While (WsDonnées.Range("A" & i).Value <> "")
        i = i + 1
        Wend

        WsDonnées.Range("A" & i).Value = WsOrigine.Range("J4").Value
        WsDonnées.Range("B" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("A" & i).Copy
        WsDonnées.Range("A" & i).PasteSpecial (xlPasteValues)

        WsDonnées.Range("B" & i).Copy
        WsDonnées.Range("B" & i).PasteSpecial (xlPasteValues)

    End If

     If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "B11*" Then

        WsDonnées.Range("C" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("C" & i).Copy
        WsDonnées.Range("C" & i).PasteSpecial (xlPasteValues)

    End If

        If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Al27*" Then

        WsDonnées.Range("D" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("D" & i).Copy
        WsDonnées.Range("D" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cr52*" Then

        WsDonnées.Range("E" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("E" & i).Copy
        WsDonnées.Range("E" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Mn55*" Then

        WsDonnées.Range("F" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("F" & i).Copy
        WsDonnées.Range("F" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Fe56*" Then

        WsDonnées.Range("G" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("G" & i).Copy
        WsDonnées.Range("G" & i).PasteSpecial (xlPasteValues)
    End If


    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Co59*" Then

        WsDonnées.Range("H" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("H" & i).Copy
        WsDonnées.Range("H" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Ni60*" Then

        WsDonnées.Range("I" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("I" & i).Copy
        WsDonnées.Range("I" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cu65*" Then

        WsDonnées.Range("J" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("J" & i).Copy
        WsDonnées.Range("J" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Zn66*" Then

        WsDonnées.Range("K" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("K" & i).Copy
        WsDonnées.Range("K" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "As75*" Then

        WsDonnées.Range("L" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("L" & i).Copy
        WsDonnées.Range("L" & i).PasteSpecial (xlPasteValues)

    End If

     If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Mo98*" Then

        WsDonnées.Range("M" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("M" & i).Copy
        WsDonnées.Range("M" & i).PasteSpecial (xlPasteValues)

    End If

       If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cd114*" Then

        WsDonnées.Range("N" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("N" & i).Copy
        WsDonnées.Range("N" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Sn118*" Then

        WsDonnées.Range("O" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("O" & i).Copy
        WsDonnées.Range("O" & i).PasteSpecial (xlPasteValues)

    End If

      If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Sb121*" Then

        WsDonnées.Range("P" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("P" & i).Copy
        WsDonnées.Range("P" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Ba137*" Then

        WsDonnées.Range("Q" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("Q" & i).Copy
        WsDonnées.Range("Q" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Pb...*" Then

        WsDonnées.Range("R" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("R" & i).Copy
        WsDonnées.Range("R" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "U238*" Then

        WsDonnées.Range("S" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("S" & i).Copy
        WsDonnées.Range("S" & i).PasteSpecial (xlPasteValues)

    End If

    If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Se78*" Then

        WsDonnées.Range("T" & i).Value = WsOrigine.Cells(l, 7).Value

        WsDonnées.Range("T" & i).Copy
        WsDonnées.Range("T" & i).PasteSpecial (xlPasteValues)

    End If


    l = l + 1
Wend

'Define the LastRow/LastCol
LastRow = WsDonnées.Cells(Rows.Count, "A").End(xlUp).Row
LastRow2 = WsZscore.Cells(Rows.Count, "A").End(xlUp).Row
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column

'Copy the last row from Sheet1 and transpose it to the last empty column in Sheet2
WsDonnées.Cells(LastRow, 1).EntireRow.Copy
WsZscore.Cells(2, LastCol + 1).PasteSpecial Transpose:=True

'If a cell display Uncalib, display nothing
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol + 1).Value = "Uncalib" Then
    WsZscore.Cells(i, LastCol + 1).Value = ""
End If
Next i

'Apply the formula to the values expect for the blank ones
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol).Value = "" Then
    WsZscore.Cells(i, LastCol + 1).Value = ""
    Else
        WsZscore.Cells(i, LastCol + 1).Formula = "=(RC[-1]-RC2)/(RC3/2)"
End If
Next i


LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
WsZscore.Cells(2, LastCol).EntireColumn.Copy
WsZscore.Cells(2, LastCol - 1).EntireColumn.PasteSpecial xlPasteValues
WsZscore.Cells(2, LastCol).EntireColumn.Delete


'Apply the absolute formula to the non-empty cells and display the result in the cell to the right
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
For i = 3 To LastRow2
WsZscore.Cells(i, LastCol + 1).Formula = "=ABS(RC[-1])"
WsZscore.Cells(i, LastCol + 1).Value = WsZscore.Cells(i, LastCol + 1).Value


'Set my conditional formatting rules
Set iset = WsZscore.Cells(i, LastCol + 1).FormatConditions.AddIconSetCondition
'select the traffic lights iconset
With iset
    .IconSet = ActiveWorkbook.IconSets(xl3Symbols)
    .ReverseOrder = True
    .ShowIconOnly = True
End With
'specify amber traffic light for values >= 80% of target(2500)
With iset.IconCriteria(2)
    .Type = xlConditionValueNumber
    .Operator = xlGreaterEqual
    .Value = "=2"
End With
'specify green traffic light for values >= the target(2500)
With iset.IconCriteria(3)
    .Type = xlConditionValueNumber
    .Operator = xlGreaterEqual
    .Value = "=3"
End With

WsZscore.Cells(i, LastCol).NumberFormat = "0.00"

Next i

'Display nothing and delete CF if the cell is blank
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol).Value = "" Then
    WsZscore.Cells(i, LastCol + 1).FormatConditions.Delete
    WsZscore.Cells(i, LastCol + 1).Value = ""

End If
Next i

WsZscore.Cells(2, LastCol).Value = WsDonnées.Cells(LastRow, 1).Value
WsZscore.Cells(2, LastCol).Font.Bold = True


Application.ScreenUpdating = True

 End Sub
````

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