2017-04-06 201 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