如何制作包含双 select 的 vba 函数

How to make vba function which contain a double select

我曾经有一个用于此过程的子程序,但我试图转换成一个函数但没有成功。可能吗?如果尝试做一个子例程,它会完美地工作。也许这只是关于 Sub 和函数之间的区别,但我不确定这一点。我在网上看了好几个小时,但还是找不到答案。请你帮助我好吗?提前谢谢你

Function Comparacion_Ventas(Pais As String, _
                            Tienda_Anterior As Integer, _ 
                            Tienda_Posterior As Integer, _ 
                            AñoEstudio As Integer, _
                            MesEstudio As Integer, _ 
                            AñoPosteriorEstudio As Integer, _ 
                            AñoAnteriorComparado As Integer)

    Dim Posterior As New ADODB.Recordset
    Dim Anterior  As New ADODB.Recordset
    Dim conn As New ADODB.Connection
    Dim sql As String
    Dim carac_conn As String
    Dim i As Integer
    Dim j As Integer

    Dim Diferencia_Ventas As Double
    Dim Diferencia_Alquileres As Double
    Dim Suma_Ventas As Double
    Dim Suma_Alquileres As Double

    Diferencia_Ventas = 0
    Diferencia_Alquileres = 0
    Suma_Ventas = 0
    Suma_Alquileres = 0

    sql = "SELECT EBIT_Nuevo_" & Pais & ".Tienda, EBIT_Nuevo_" & Pais & ".Ejercicio, EBIT_Nuevo_" & Pais & ".Periodo_Contable, EBIT_Nuevo_" & Pais & _ 
          ".Cifra_de_Ventas, EBIT_Nuevo_" & Pais & ".ALQUILERES" & _
          " FROM EBIT_Nuevo_" & Pais & "" & _
          " WHERE ((EBIT_Nuevo_" & Pais & ".Tienda IN (" & Tienda_Posterior & ") ) AND ((EBIT_Nuevo_" & Pais & ".Cifra_de_Ventas > 0)) AND " & _
          "((EBIT_Nuevo_" & Pais & ".Ejercicio=" & AñoEstudio & ") AND (EBIT_Nuevo_" & Pais & ".Periodo_Contable>" & MesEstudio & ") OR " & _
          "(EBIT_Nuevo_" & Pais & ".Ejercicio=" & AñoPosteriorEstudio & ") AND (EBIT_Nuevo_" & Pais & ".Periodo_Contable<=" & MesEstudio & "))) " & _
          " ORDER BY EBIT_Nuevo_" & Pais & ".Tienda, EBIT_Nuevo_" & Pais & ".Ejercicio, EBIT_Nuevo_" & Pais & ".Periodo_Contable "

    carac_conn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ThisWorkbook.Path & "\Basetdas_New.mdb"
    ' Conexión a BD
    conn.Open ConnectionString:=carac_conn
    ' Petición a BD
    Posterior.Open Source:=sql, ActiveConnection:=conn

    ' Datos obtenidos
    If Posterior.EOF = True Then
        MsgBox " No hay datos en la base de datos", vbInformation
    Else
        Posterior_array = Posterior.GetRows()
    End If

    Posterior.Close
    conn.Close

    sql = "SELECT EBIT_Nuevo_" & Pais & ".Tienda, EBIT_Nuevo_" & Pais & ".Ejercicio, EBIT_Nuevo_" & Pais & ".Periodo_Contable, EBIT_Nuevo_" & _ 
          Pais & ".Cifra_de_Ventas, EBIT_Nuevo_" & Pais & ".ALQUILERES" & _
          " FROM EBIT_Nuevo_" & Pais & "" & _
          " WHERE ((EBIT_Nuevo_" & Pais & ".Tienda IN (" & Tienda_Anterior & ") ) AND ((EBIT_Nuevo_" & Pais & ".Cifra_de_Ventas > 0)) AND " & _
          "((EBIT_Nuevo_" & Pais & ".Ejercicio=2013) AND (EBIT_Nuevo_" & Pais & ".Periodo_Contable<" & MesEstudio & ") OR " & _
          "(EBIT_Nuevo_" & Pais & ".Ejercicio=" & AñoAnteriorComparado & ") AND (EBIT_Nuevo_" & Pais & ".Periodo_Contable>=" & MesEstudio & "))) " & _
          " ORDER BY EBIT_Nuevo_" & Pais & ".Tienda, EBIT_Nuevo_" & Pais & ".Ejercicio, EBIT_Nuevo_" & Pais & ".Periodo_Contable "

    carac_conn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ThisWorkbook.Path & "\Basetdas_New.mdb"
    ' Conexión a BD
    conn.Open ConnectionString:=carac_conn
    ' Petición a BD
    Anterior.Open Source:=sql, ActiveConnection:=conn

    ' Datos obtenidos
    If Anterior.EOF = True Then
        MsgBox " No hay datos en la base de datos", vbInformation
    Else
        Anterior_array = Anterior.GetRows()
    End If

    Anterior.Close
    conn.Close

    For i = 0 To UBound(Anterior_array, 2)
        For j = 0 To UBound(Posterior_array, 2)
            If Posterior_array(2, j) = Anterior_array(2, i) Then
                Diferencia_Ventas = 0
                Diferencia_Ventas = Posterior_array(3, j) - Anterior_array(3, i)
                Sheets("Example").Cells(i, 2) = Diferencia_Ventas
                Suma_Ventas = Suma_Ventas + Diferencia_Ventas
                Exit For
            End If
        Next j
    Next i

    Comparacion_Ventas = Suma_Ventas
End Function

您还没有声明要由函数return编辑的变量类型。顺序是这样的:

Function SomeName(Parameters) AS Double

    'Do something'

    SomeName = SomeVariable

End Function

注意 AS Double 它将 return 您分配给函数的值。

记得将 Double 更改为您尝试 return 的实际数据类型。