RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1599561
Accepted
Михаил Ширшов
Михаил Ширшов
Asked:2024-11-12 19:34:51 +0000 UTC2024-11-12 19:34:51 +0000 UTC 2024-11-12 19:34:51 +0000 UTC

如何在 VBA for Excel 中创建针对 SQLite 数据库的查询并检索数据?

  • 772

这是我的代码:

    Sub GetCadastralInfo()
    Dim dbPath As String
    Dim cadNumber As String
    Dim conn As Object
    Dim rs As Object
    Dim sql As String
    Dim result As Variant
    Dim i As Integer

    On Error GoTo ErrorHandler

    dbPath = "C:\my_python\Bot_aio\akt\egrn_kpt.db"
    
    cadNumber = Trim(ActiveCell.Value) ' Удалить лишние пробелы
    
    ' Соединение
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    ' Откройте соединение с базой данных
    conn.Open "Driver={SQLite3 ODBC Driver};Database=" & dbPath & ";"
    
    ' SQL запрос для поиска информации по кадастровому номеру
    sql = "SELECT value_by_document FROM ZY WHERE cad_n = '" & cadNumber & "';"
    
    ' Выполните запрос и получите набор записей
    Set rs = conn.Execute(sql)
    
    ' Инициализация переменной строки
    i = 1 ' Начинаем с первой строки
    
    ' Проверка наличия данных
    If Not rs.EOF Then
        While Not rs.EOF
            Cells(i, 1).Value = rs.Fields(0).Value
            ' Если у вас есть второе поле, убедитесь, что оно существует
            If rs.Fields.Count > 1 Then
                Cells(i, 2).Value = rs.Fields(1).Value
            End If
            i = i + 1
            rs.MoveNext
        Wend
    Else
        MsgBox "Нет данных для данного кадастрового номера.", vbInformation
    End If
    
    ' Закрытие набора записей и соединения
    rs.Close
    conn.Close

    Exit Sub

ErrorHandler:
    MsgBox "Ошибка: " & Err.Description, vbCritical, "Ошибка"
    If Not rs Is Nothing Then
        If rs.State = 1 Then rs.Close ' Закрываем, если открыто
    End If
    If Not conn Is Nothing Then
        If conn.State = 1 Then conn.Close ' Закрываем, если открыто
    End If
End Sub

由于某种原因,它不断显示:“该地籍号码没有数据。”,尽管数据库在ZY表中有一个条目(这些是土地),并且我想要value_by_document列(这是土地的 VRI,例如 - “用于运行个人附属地块”)。因此,在单元格 A1 中(例如),我输入地籍号码(例如 - “52:15:0140112:10”),然后按组合键ctrl+f8并执行此代码,它显示没有数据。SQLite ODBC 驱动程序是从网站安装的。我想编写可以访问数据库的代码。请帮忙。

excel
  • 2 2 个回答
  • 48 Views

2 个回答

  • Voted
  1. Михаил Ширшов
    2024-11-13T13:05:29Z2024-11-13T13:05:29Z

    感谢@Akina的回答,结果是下面的代码,它可能不是很好,但它从SQLite数据库插入数据。你可以继续前进

    Sub GetCadastralInfo()
        Dim dbPath As String
        Dim cadNumber As String
        Dim conn As Object
        Dim rs As Object
        Dim sql As String
    
        On Error GoTo ErrorHandler
    
        dbPath = "C:\my_python\Bot_aio\akt\egrn_v.db"
        
        cadNumber = Trim(ActiveCell.Value)
    
        Set conn = CreateObject("ADODB.Connection")
        Set rs = CreateObject("ADODB.Recordset")
    
        conn.Open "Driver={SQLite3 ODBC Driver};Database=" & dbPath & ";"
        
        sql = "SELECT by_document FROM Information_objects WHERE cad_numb = '" & cadNumber & "';"
        Set rs = conn.Execute(sql)
        
    
        If Not rs.EOF Then
            rs.MoveFirst ' Установить указатель на первую запись
            
            ' Цикл для перебора записей
            Do While Not rs.EOF
                Range("B1").Value = rs.Fields(0).Value
                rs.MoveNext ' Перейти к следующей записей
            Loop
        Else
            MsgBox "Нет данных для данного кадастрового номера.", vbInformation
        End If
        
        rs.Close
        conn.Close
    
        Exit Sub
    
    ErrorHandler:
        Debug.Print Err.Description
    
        If Not rs Is Nothing Then
            If rs.State = 1 Then rs.Close ' Закрыть, если открыто
        End If
        If Not conn Is Nothing Then
            If conn.State = 1 Then conn.Close ' Закрыть, если открыто
        End If
    End Sub
    
    • 0
  2. Best Answer
    Михаил Ширшов
    2024-11-29T21:09:23Z2024-11-29T21:09:23Z
    Function ПоискВБазе(КадастровыйНомер As String, НаименованиеШапкиТаблицы As String) As Variant
        Dim dbPath As String
        Dim conn As Object
        Dim rs As Object
        Dim sql As String
        Dim resultValue As Variant
        Dim dateList As Collection
        Dim dateStr As String
        Dim currentDate As Date
        Dim maxDate As Date
        Dim maxDateStr As String
        Dim i As Integer
    
        On Error GoTo ErrorHandler
        dbPath = "C:\my_python\Bot_aio\akt\egrn_v.db"
        КадастровыйНомер = Trim(КадастровыйНомер)
        Set conn = CreateObject("ADODB.Connection")
        Set rs = CreateObject("ADODB.Recordset")
        conn.Open "Driver={SQLite3 ODBC Driver};Database=" & dbPath & ";"
        
        ' Получение всех дат
        sql = "SELECT date_formation FROM Information_objects WHERE cad_numb = '" & КадастровыйНомер & "';"
        Set rs = conn.Execute(sql)
        
        Set dateList = New Collection
        If Not rs.EOF Then
            Do While Not rs.EOF
                dateStr = rs.Fields("date_formation").Value
                On Error Resume Next
                currentDate = CDate(dateStr)
                If Err.Number = 0 Then
                    dateList.Add currentDate
                End If
                On Error GoTo ErrorHandler
                rs.MoveNext
            Loop
            
            ' Найти максимальную дату
            If dateList.Count > 0 Then
                maxDate = dateList(1)
                For i = 2 To dateList.Count
                    If dateList(i) > maxDate Then
                        maxDate = dateList(i)
                    End If
                Next i
    
                maxDateStr = Format(maxDate, "dd.mm.yyyy")
            End If
        End If
        
        sql = "SELECT " & НаименованиеШапкиТаблицы & " FROM Information_objects WHERE cad_numb = '" & КадастровыйНомер & "' AND date_formation = '" & maxDateStr & "';"
        
        ' Выполнение запроса и получение результата
        Set rs = conn.Execute(sql)
        If Not rs.EOF Then
            resultValue = rs.Fields(0).Value
            
            ' Замена точек на запятые для указанных столбцов
            If НаименованиеШапкиТаблицы = "cost_value" Or _
               НаименованиеШапкиТаблицы = "area" Or _
               НаименованиеШапкиТаблицы = "built_up_area" Or _
               НаименованиеШапкиТаблицы = "extension" Or _
               НаименованиеШапкиТаблицы = "depth" Or _
               НаименованиеШапкиТаблицы = "occurence_depth" Or _
               НаименованиеШапкиТаблицы = "volume" Or _
               НаименованиеШапкиТаблицы = "height" Or _
               НаименованиеШапкиТаблицы = "degree_readiness" Then
                
                If Not IsNull(resultValue) Then
                    Dim formattedValue As String
                    formattedValue = Replace(resultValue, ".", ",")
                    
                    If НаименованиеШапкиТаблицы = "cost_value" Then
                        ПоискВБазе = formattedValue
                    Else
                        ПоискВБазе = formattedValue ' Возвращаем отформатированное значение для других столбцов
                    End If
                    
                Else
                    ПоискВБазе = ""
                End If
                
            Else
                If IsNull(resultValue) Or resultValue = 0 Then
                    ПоискВБазе = ""
                Else
                    ПоискВБазе = resultValue
                End If
            End If
            
        Else
            ПоискВБазе = ""
        End If
    
    Cleanup:
        On Error Resume Next ' Игнорируем ошибки при закрытии объектов
        If Not rs Is Nothing Then If rs.State = 1 Then rs.Close ' Закрываем набор записей, если он открыт
        If Not conn Is Nothing Then If conn.State = 1 Then conn.Close ' Закрываем соединение, если оно открыто
        
        Exit Function
    
    ErrorHandler:
        ПоискВБазе = "Ошибка: " & Err.Description
        Resume Cleanup
    
    End Function
    

    结果在最终版本中是这样的,它似乎有效......也许写得很笨拙......@Akina抱歉,我不明白......我做了上面的rs.MoveFirst(在原始代码中,不是我发布的),而是代码为什么它不起作用,我挣扎了很长时间,我的头疼得要命))))最后我做了一张表格,写下了列的名称从数据库中将其发送到此处sql = "SELECT " & НаименованиеШапкиТаблицы & " FROM Information_objects WHERE cad_numb = '" & КадастровыйНомер & "' AND date_formation = '" & maxDateStr & "';"搜索当前信息所需的最大日期(日期) 。摘自国家统一房地产登记册)

    • 0

相关问题

  • 使用 VBA 在 Excel 中插入图片

  • 选择哪里(EXCEL)

  • 两列的条件格式

  • 如何按文章比较两个表格?

  • 打开工作簿时,跳转到当前日期的单元格[关闭]

  • 在工作簿之间复制数据。WBA代码加速

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5