【问题标题】:Macro to transfer data from Access to Excel I am facing problem宏将数据从 Access 传输到 Excel 我面临问题
【发布时间】:2020-09-09 14:34:41
【问题描述】:

我是 excel 宏访问的新手,我在 access 数据库中创建了一个宏,用于将数据/查询从 MS Access 数据库传输到 excel。 在演示之前,我的代码/宏运行良好。但是现在我遇到了一个问题,即在将数据传输到 excel 之后,B 列中的值应该更改我在 for 循环中更新条件的值,如下所示......现在它在第一个值 FXV 处进行调试,在 excel 中不会像我编码的那样将值更改为 FFJ。但是,当它是 FLB 时,它曾经可以正确更改值,但现在它不适用于 FXV,并且宏变慢。有人可以帮忙解决这个问题吗?

下面是我的完整代码: - 所以宏将数据从访问到 excel 然后在 excel 中它应该更改我在 FOR 循环中编码的 B 列中存在的值它正在工作但现在不是我不知道为什么?任何人都可以帮我解决这个问题..... 问题出在 For 循环中,当我将 i = 2 范围更改为 999 时,它将运行并粘贴数据,但不会将 FXV 的值更改为 FFJ ... 如果我更改 i = 1 到 999 或 i = 0 到 999 的范围,它将调试如下所示....请帮助....

Option Compare Database
Option Explicit

Private Sub Command0_Click()
ExportToExcel
End Sub

Public Sub ExportToExcel()

Dim xl As Excel.Application
Dim wbtarget As Workbook

Dim FinalExp As QueryDef
Dim rsFinalExp As Recordset

Dim i As Integer


'Set up reference to the query to export

Set FinalExp = CurrentDb.QueryDefs("FinalExp")

'Debug.Print FinalExp.SQL

'Set up the parameter
'Execute the query

Set rsFinalExp = FinalExp.OpenRecordset()

'programetically reference exel

Set xl = CreateObject("Excel.Application")

'set ref to the export workbook (Paste the Excel Path)

Set wbtarget = xl.Workbooks.Open("path.xlsm")

'use paste from recordset to put in excel sheet
wbtarget.Worksheets("SampleFile").Cells(2, 1).CopyFromRecordset rsFinalExp


'Replace the FWD_Code's in column 2
 For i = 0 To 9999

If Worksheets("SampleFile").Range("B" & i).Value = "FXV" Then
      Worksheets("SampleFile").Range("B" & i).Value = "FFJ"
 
   ElseIf Worksheets("SampleFile").Range("B" & i).Value = "FAM" Then
            Worksheets("SampleFile").Range("B" & i).Value = "FST"
 
   ElseIf Worksheets("SampleFile").Range("B" & i).Value = "FLB" Then
            Worksheets("SampleFile").Range("B" & i).Value = "FST"
            
 End If
 
 Next


'save workbook
wbtarget.Save

wbtarget.Close

Set wbtarget = Nothing
Set xl = Nothing

Set FinalExp = Nothing

End Sub

【问题讨论】:

  • 没有B0
  • 它应该在哪里
  • 与其循环您刚刚复制的单元格,不如在记录集中进行更改(可能使用IIf 或使用查找表)更有效。此外,如果您有超过 999 条记录,您的代码将无法按预期工作 - 您应该找出需要循环多少次(使用 .RecordCountws.Cells(ws.Rows.Count, "A").End(xlUp).Row)。如果你只导出 2 行,那么循环 999 行是没有意义的。

标签: excel vba ms-access


【解决方案1】:

最好声明一个工作表变量,并使用Select Case

Dim ws As Excel.Worksheet
Set wbtarget = xl.Workbooks.Open("C:\path.xlsm")
Set ws = wbtarget.Worksheets("SampleFile") 

ws.Cells(2, 1).CopyFromRecordset rsFinalExp

For i = 2 To ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    With ws.Cells(i, "B")
         Debug.Print .Parent.Name, .Address(), .Value '<<< for debugging
         Select Case .Value
             Case "FXV": .Value = "FFJ"
             Case "FAM": .Value = "FST"
             Case "FLB": .Value = "FST"
         End Select
     End With 
Next i

wbtarget.Close True 'save on close

【讨论】:

  • 不,它不工作的宏不会改变值 Case "FXV": .Value = "FFJ" Case "FAM": .Value = "FST" Case "FLB": .Value = "FST "
  • 你试过调试看看问题出在哪里吗?
  • 宏执行没有任何错误,它传输数据但不替换值..
  • 似乎这些值没有触发任何替换?请参阅上面的编辑。
  • 不,不是...它将数据从 Access 传输到 Excel,但不会更改 Excel 文件中的值....这是我使用的代码,它没有给出任何错误也请参阅上面我已经复制粘贴了完整的代码
猜你喜欢
  • 2016-10-13
  • 2015-10-11
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多