2017-04-06 126 views
0

我不知道VBA,我只是在出于必要的情况下才这么做,所以原谅我。我通常只是做T-SQL。命令按钮中的VBA代码在按钮单击时不起作用

我在帮助文章中发现了以下代码,可以从Excel工作表中获取数据并将其输出到将用于运行Scribe的txt文件中。至今;

  1. 我已经放置在纸张上的命令按钮
  2. 我右点击查看代码
  3. 我从文章到VBA编辑器粘贴代码,并适应它的部分我的需求(基本上是文件路径)

当我从编辑器运行代码时,它表现完美。

当我关闭编辑器并单击工作表上的按钮时,它会运行,但生成的文本文件只是文本文件中空字符串的适当数量。就像它可以看到具有数据的行数,但不是单元格中的实际数据。

我错过了一些明显的东西吗?在帮助文章中我看不到任何更多内容(这不是真正写给完全新手的我不得不说),它可以解决问题!

Sub CommandButton1_Click() 

Dim FilePath As String 
Dim rng As Range 
Dim CellData As String 
Dim LastCol As Long 
Dim LastRow As Long 

LastCol = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column 

LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 

Set rng = Worksheets("Discount Template").Range("B3") 

FilePath = "\\SERVER2012\IT Dept\AccessSupplyChain\Product Discount Uploads\" & rng.Value & "_" & Format(Now(), "yyyymmdd hhmmss") & ".txt" 

Open FilePath For Output As #2 

For i = 1 To LastRow 

    For j = 1 To LastCol 

     If j = LastCol Then 
     CellData = CellData + Trim(ActiveCell(i, j).Value) 

     Else 

     CellData = CellData + Trim(ActiveCell(i, j).Value) + "," 

    End If 

Next j 

Print #2, CellData 
CellData = "" 

Next i 

Close #2 
MsgBox ("Done") 

End Sub 
+0

是在同一张纸上的数据的按钮?你的代码使用'ActiveSheet'来查找'LastCol'等,但之后再引用''Discount Template''。如果该按钮与数据不在同一张纸上,则不会使用此方法查看数据。 – CLR

+0

在'Sub CommandButton1_Click()'中放置了一个断点,看它是否被调用 –

+0

只要我能够使用的代码'Set rng = Worksheets(“Discount Template”)。Range(“B3”)'从名为“折扣模板”的第一张表中获取客户参考号。那个变量没有被用在脚本的任何其他部分,因为那是我从另一个解决方案中取得的。 rng变量不是我提到的问题帮助文章的一部分。我已经评论了这一行代码,并从文件路径中删除它的使用,但没有改变任何东西。 –

回答

1

为了让您使用的是ActiveCell(i, j).Value但在你的代码,我不能找到你更新ActiveCell细胞的价值。

所以你一遍又一遍地使用同一个单元格。

相反,你应该写:Worksheets("youeSheetName").Cell(i, j).Value

也应该更改ActiveSheet您使用LastRowLastCol让你Worksheets("youeSheetName")

希望我能帮上忙。

+0

谢谢你。我已经相应地更改了这些代码部分,但是当运行一条消息时弹出“Sub或Function not defined”并突出显示“Worksheet”的第一次出现。我猜我需要在顶部添加其他变量以使其识别工作表函数? (这是我对vba> _ <的知之甚少) –

+0

@ SteveClarke-Keating哦,实际上它应该是'Worksheets'最后一个s,对此抱歉。我在我的回答中也纠正了它。 – FatTony

1

问题是使用ActiveCell哪个不是被迫是A1单元!

所以你想改变ActiveCell(i, j)Cells(i, j)

,但我也建议你下面的重构你的代码:

Option Explicit 

Private Sub CommandButton1_Click() 
    Dim FilePath As String 
    Dim rng As Range 
    Dim iRow As Long 

    Set rng = Worksheets("Discount Template").Range("B3") 

    FilePath = "\\SERVER2012\IT Dept\AccessSupplyChain\Product Discount Uploads\" & rng.Value & "_" & Format(Now(), "yyyymmdd hhmmss") & ".txt" 

    Open FilePath For Output As #2 
    With UsedRange '<--| reference active sheet used range 
     For iRow = 1 To .Rows.Count '<--| loop through its rows 
      Print #2, Join(Application.Transpose(Application.Transpose(.Rows(iRow))), ",") '<--| print the whole current row in one shot 
     Next 
    End With 
    Close #2 
    MsgBox ("Done") 
End Sub