简体   繁体   English

VBA & SQL 如何 select 基于 ZBF57C906FA7D48566D07372E 范围的特定值

[英]VBA & SQL how to select specific values based on range in excel?

I am newbie in connection of vba (excel) and oracle database.我是 vba (excel) 和 oracle 数据库的新手。 I have tried to look for some information but I could not find anything that would work for me.我试图寻找一些信息,但我找不到任何对我有用的东西。

I want to write a query that will return me only rows in which there is a specific values.我想编写一个查询,它只返回包含特定值的行。 My query looks like this: SQLStr = SQLStr = "SELECT NGKHFHCD, NGKHFNAM, NGKHGNKA, NGKHSZIC, NGKHMTRC, NGKHSNZC, NGKHGCHC, NGKHKKKS, NGKHKTKS FROM NGKH order by NGKHFHCD"我的查询如下所示: SQLStr = SQLStr = "SELECT NGKHFHCD, NGKHFNAM, NGKHGNKA, NGKHSZIC, NGKHMTRC, NGKHSNZC, NGKHGCHC, NGKHKKKS, NGKHKTKS FROM NGKH order by NGKHFHCD"

But I want to have something that will be like this SQLStr = "SELECT NGKHFHCD, NGKHFNAM, NGKHGNKA, NGKHSZIC, NGKHMTRC, NGKHSNZC, NGKHGCHC, NGKHKKKS, NGKHKTKS FROM NGKH WHERE NGKHFHCD = SHeet1(A2:A)"但我想要这样的东西SQLStr = "SELECT NGKHFHCD, NGKHFNAM, NGKHGNKA, NGKHSZIC, NGKHMTRC, NGKHSNZC, NGKHGCHC, NGKHKKKS, NGKHKTKS FROM NGKH WHERE NGKHFHCD = SHeet1(A2:A)"

I just don't want to pull out whole table from oracle, because it will take a lots of time so I thought that maybe I can return only specific rows from that table.我只是不想从 oracle 中取出整个表,因为这会花费很多时间,所以我想也许我只能从该表中返回特定的行。 Also if there is no searched value in the table I would like to mark it in someway.此外,如果表中没有搜索到的值,我想以某种方式标记它。

Is there anyway to solve it?有什么办法解决吗?

my code:我的代码:

Sub OracleLocalConnect()
  Dim RecordSet As New ADODB.RecordSet
  Dim con As New ADODB.Connection
  Dim ExcelRange As Range
  Dim SQLStr As String
  
  Dim ws As Worksheet

  con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=***;Password=****;Data Source=*****;"
  
  con.Open
  Set RecordSet = CreateObject("ADODB.Recordset")

  SQLStr = "SELECT GNKHFHCD, GNKHFNAM, GNKHGNKA, GNKHSZIC, GNKHMTRC,  GNKHSNZC, GNKHGCHC, GNKHKKKS, GNKHKTKS  FROM GNKH ORDER BY GNKHFHCD"  


  RecordSet.Open SQLStr, con, adOpenStatic, adLockReadOnly
  
  Set ws = ActiveWorkbook.Sheets("Prices")
  Set ExcelRange = ws.Range("A2")
  ExcelRange.CopyFromRecordset RecordSet
  
  RecordSet.Close
  con.Close
Exit Sub
Exit Sub

End Sub

Untested but this would be close:未经测试,但这将是接近的:

Sub OracleLocalConnect()
  
    Dim RecordSet As New ADODB.RecordSet
    Dim con As New ADODB.Connection
    Dim ExcelRange As Range
    Dim SQLStr As String
    
    Dim ws As Worksheet
    
    con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=***;Password=****;Data Source=*****;"
    
    con.Open
    Set RecordSet = CreateObject("ADODB.Recordset")
    
    SQLStr = " SELECT GNKHFHCD, GNKHFNAM, GNKHGNKA, GNKHSZIC, GNKHMTRC, " & _
            " GNKHSNZC, GNKHGCHC, GNKHKKKS, GNKHKTKS  FROM GNKH " & _
            " where " & InClause(Sheet1.Range("A2:A1000"), "GNKHFHCD", True) & _
            " ORDER BY GNKHFHCD "
    
    RecordSet.Open SQLStr, con, adOpenStatic, adLockReadOnly
    
    Set ws = ActiveWorkbook.Sheets("Prices")
    Set ExcelRange = ws.Range("A2")
    ExcelRange.CopyFromRecordset RecordSet
    
    RecordSet.Close
    con.Close

End Sub

'Create an in clause for an Oracle query
Function InClause(rng As Range, colName As String, Optional quoted As Boolean = False)
'https://stackoverflow.com/questions/400255/how-to-put-more-than-1000-values-into-an-oracle-in-clause
    Dim s As String, c As Range, qt As String, sep As String
    qt = IIf(quoted, "'", "")
    sep = ""
    s = "(999, " & colName & ") in ("
    For Each c In rng.Cells
        If Len(c.Value) > 0 Then
            s = s & sep & vbLf & "(999," & qt & c.Value & qt & ")"
            sep = "," 'add comma after first pass
        End If
    Next c
    InClause = s & ")"
End Function

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM