Как разобрать значение "col" для Const NameCol в Excel VBA - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу использовать то же значение строки " col " из первого подпункта в " Const NameCol " во втором подпрограмме и пробовал несколько способов, но не смог преуспеть. Я спешу, чтобы любой обходной путь для этой проблемы был бы действительно полезен. Ошибка, которую я получил при последнем запуске: « Ошибка компиляции: требуется выражение Const » на втором сабвуфере. Если я напишу " const Namecol =" B "", это сработает, но не связывается со строкой col. Вот код:

Sub CopyTest()
    Dim ws As Worksheet
    Dim wsnew As Worksheet
    Dim i As Integer
    Dim j As Integer
    Dim col As String

    col = InputBox("Enter column name")
    Set ws = ActiveWorkbook.Worksheets("Copy of Products-Export-2020-Ap")

    For i = 2 To ws.Range(col & ws.Rows.Count).End(xlUp).Row
    CopyConditional ws, ws.Range(col & i).Value
    Next i

End Sub

Sub CopyConditional(wshS As Worksheet, WhichName As String)
    Const Namecol = col
    Const FirstRow = 2

    Dim LastRow As Long
    Dim SrcRow As Long
    Dim TrgRow As Long
    Dim wshT As Worksheet

    On Error Resume Next
    Set wshT = Worksheets(WhichName)
    If wshT Is Nothing Then
        Set wshT = Worksheets.Add(After:=wshS)
        wshT.Name = WhichName
    End If
    On Error GoTo 0

    wshT.Rows.Clear
    wshS.Rows(1).Copy Destination:=wshT.Cells(1, 1)

    TrgRow = wshT.Cells(wshT.Rows.Count, Namecol).End(xlUp).Row + 1
    LastRow = wshS.Cells(wshS.Rows.Count, Namecol).End(xlUp).Row

    For SrcRow = FirstRow To LastRow
        If wshS.Cells(SrcRow, Namecol) = WhichName Then
            wshS.Cells(SrcRow, 1).EntireRow.Copy Destination:=wshT.Cells(TrgRow, 1)
            TrgRow = TrgRow + 1
        End If
    Next SrcRow

End Sub

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

@ BigBen показал вам, как изменить код, передав col вызываемому Sub.

Вот как вы можете изменить свой код, объявив col как переменную уровня модуля:

Option Explicit
Public col As String
Sub CopyTest()
    Dim ws As Worksheet
    Dim wsnew As Worksheet
    Dim i As Integer
    Dim j As Integer

    'Dim col As String

    col = InputBox("Enter column name")
    Set ws = ActiveWorkbook.Worksheets("Copy of Products-Export-2020-Ap")

    For i = 2 To ws.Range(col & ws.Rows.Count).End(xlUp).Row
    CopyConditional ws, ws.Range(col & i).Value
    Next i

End Sub

Sub CopyConditional(wshS As Worksheet, WhichName As String)
    Dim Namecol As String: Namecol = col
    Const FirstRow = 2

…
1 голос
/ 23 апреля 2020

По определению, постоянная равна постоянная и не изменяется. Правая часть объявления Const не может быть выражением переменной (которым является col, потому что пользователь вводит его).

Const nameCol As String = "B" '<~ this is good
Const nameCol As String = col '<~ col can change ... so by definition, this is bad

Устранить проблему Вы можете добавить дополнительный параметр к CopyConditional и передать col.

Sub CopyConditional(ByVal wshS As Worksheet, ByVal WhichName As String, ByVal Namecol As String)
   ' remove the Const Namecol = col line

Затем при вызове CopyConditional:

CopyConditional ws, ws.Range(col & i).Value, col
...