返回列表 上一主題 發帖

[發問] 各位先進大家好,有個小問題想問

[發問] 各位先進大家好,有個小問題想問

各位先進您們好:

小弟最近自學了excel中的vba來寫一些程式,最近遇到幾個問題想請教
先附上我寫的程式碼

Sub firstrecord()
    '將儲存格A3編號為1'
    Worksheets("salary").Range("A3").Value = "1"
   
    '將應支金額填入,並相對應excel的儲存格'
    Worksheets("salary").Range("B3").Value = UserForm1.Textbox1.Text
    Worksheets("salary").Range("C3").Value = UserForm1.TextBox2.Text
    Worksheets("salary").Range("D3").Value = UserForm1.TextBox3.Text
    Worksheets("salary").Range("E3").Value = UserForm1.TextBox4.Text
    Worksheets("salary").Range("F3").Value = UserForm1.TextBox5.Text
    Worksheets("salary").Range("G3").Value = UserForm1.TextBox6.Text
    Worksheets("salary").Range("H3").Value = UserForm1.TextBox7.Text
    Worksheets("salary").Range("I3").Value = UserForm1.TextBox8.Text
    Worksheets("salary").Range("J3").Value = UserForm1.TextBox9.Text
    Worksheets("salary").Range("K3").Value = UserForm1.TextBox10.Text
   
    '將應扣金額填入,並相對應excel的儲存格'
    Worksheets("salary").Range("M3").Value = UserForm1.TextBox11.Text
    Worksheets("salary").Range("N3").Value = UserForm1.TextBox12.Text
    Worksheets("salary").Range("O3").Value = UserForm1.TextBox13.Text
    Worksheets("salary").Range("P3").Value = UserForm1.TextBox14.Text
    Worksheets("salary").Range("Q3").Value = UserForm1.TextBox15.Text
    Worksheets("salary").Range("R3").Value = UserForm1.TextBox16.Text
    Worksheets("salary").Range("S3").Value = UserForm1.TextBox17.Text
    Worksheets("salary").Range("T3").Value = UserForm1.TextBox18.Text
    Worksheets("salary").Range("U3").Value = UserForm1.TextBox19.Text
    Worksheets("salary").Range("V3").Value = UserForm1.TextBox20.Text
    Worksheets("salary").Range("W3").Value = UserForm1.TextBox21.Text
    Worksheets("salary").Range("X3").Value = UserForm1.TextBox22.Text
   
   
    '將應支金額相加'
    Dim a, b, c, d, e, f, g, h, i, j, k
   
   
    a = Worksheets("salary").Range("D3").Value
    b = Worksheets("salary").Range("E3").Value
    c = Worksheets("salary").Range("F3").Value
    d = Worksheets("salary").Range("G3").Value
    e = Worksheets("salary").Range("H3").Value
    f = Worksheets("salary").Range("I3").Value
    g = Worksheets("salary").Range("J3").Value
    h = Worksheets("salary").Range("K3").Value
    i = b * c
    j = d * e
    k = f * g
   
   
    '顯示出應支金額小計'
    UserForm1.Label19 = a + i + j + k
    UserForm1.Label19 = Worksheets("salary").Range("L3").Value
   
    '顯示各項目小計'
   
    UserForm1.Label35 = i
    UserForm1.Label34 = j
    UserForm1.Label13 = k
   
    '將應扣金額相加'
    Dim aa, bb, cc, dd, ee, ff, gg, hh, ii As Integer
    aa = UserForm1.TextBox11.Text
    bb = UserForm1.TextBox12.Text
    cc = UserForm1.TextBox13.Text
    dd = UserForm1.TextBox14.Text
    ee = UserForm1.TextBox15.Text
    ff = UserForm1.TextBox22.Text
    gg = (UserForm1.TextBox16.Text) * (UserForm1.TextBox17.Text)
    hh = (UserForm1.TextBox18.Text) * (UserForm1.TextBox19.Text)
    ii = (UserForm1.TextBox20.Text) * (UserForm1.TextBox21.Text)
   
    '顯示應扣金額小計'
    Worksheets("salary").Range("Y3").Value = a1 + b1 + c1 + d1 + e1 + f1 + g1 + h1 + i1
    UserForm1.Label42 = Worksheets("salary").Range("Y3").Value
   
    '顯示實支金額'
    UserForm1.Label16 = (UserForm1.Label19) - (UserForm1.Label42)
   
End Sub

我的問題是
1.為什麼我可以直接利用自己設計的表單填完資料,順利將所打的資料填入到excel中,但是在vb環境中,檢查程式碼卻總是出現"資料型態不正確"?是因為我宣告的變數有問題嗎?
2.因為這個算是我土法煉鋼的方式,依照我的邏輯寫出來的,所以感覺有點雜,不知道是否有簡化的方式?

另外如果文章排版或是發問的規則沒有遵守到,還是看不懂我寫的T_T
還煩請各位告知,並不吝指教
謝謝

本帖最後由 GBKEE 於 2013-9-13 10:50 編輯

回復 1# wxad0285
這 a1 , b1 , c1 , d1 , e1 , f1 , g1 , h1 , i1  的數值在哪裡,
檢查程式碼卻總是出現"資料型態不正確"? 哪一行程式碼, 附檔上來才清楚錯誤在哪裡.
  1. Worksheets("salary").Range("Y3").Value = a1 + b1 + c1 + d1 + e1 + f1 + g1 + h1 + i1
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 2# GBKEE


    抱歉,我貼的那個有點錯誤
    附件內容已經把我的excel附上了,自己搞到有點昏頭@_@
    再麻煩各位先進指點一下迷津
    謝謝~

新增薪資表.rar (764.63 KB)

TOP

本帖最後由 GBKEE 於 2013-9-13 16:25 編輯

回復 3# wxad0285
試試看
  1. Option Explicit
  2. Sub firstrecord()
  3.     Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
  4.     Dim a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, e1 As Integer, f1 As Integer, g1 As Integer, h1 As Integer, i1 As Integer
  5.     Dim Sh As Worksheet, xRow As Integer, i As Integer
  6.     Set Sh = Sheets("salary")    '這裡設立工作表變數    '*** 如工作表要改名稱: 這裏改一次就可以  *****
  7.    xRow = Application.CountA(Sh.Range("a:a"))            '有資料儲存格的計數
  8.    With Sh
  9.          .Cells(xRow + 1, "A") = xRow - 1                '編號: 為有資料儲存格的計數-1
  10.         For i = 1 To 12
  11.             '將應支金額填入,並相對應excel的儲存格' 1-10
  12.             If i <= 10 Then .Cells(xRow + 1, "A").Offset(, i) = UserForm1.Controls("Textbox" & i)
  13.             '將應扣金額填入,並相對應excel的儲存格' 11-22
  14.             .Cells(xRow + 1, "M").Offset(, i - 1) = UserForm1.Controls("Textbox" & i + 10)
  15.         Next
  16.     End With
  17.     '將應支金額相加'
  18.     With UserForm1
  19.        '檢查程式碼卻總是出現"資料型態不正確"? ->'當控制項 為空白時 不可作四則運算
  20.         a = Val(.TextBox3)                    ' a 也可以 = 工作表的儲存格 ,不必加 Val函數
  21.         b = Val(.TextBox4) * Val(.TextBox5)   '儲存格為空白時自動轉為 0 可作四則運算
  22.         c = Val(.TextBox6) * Val(.TextBox7)
  23.         d = Val(.TextBox8) * Val(.TextBox9)
  24.         e = Val(.TextBox10)
  25.     '顯示出應支金額小計'
  26.         Sh.Range("L3").Value = a + b + c + d + e
  27.         .Label19 = Sh.Range("L3")
  28.     '顯示各項目小計'
  29.         .Label35 = b
  30.         .Label34 = c
  31.         .Label13 = d
  32.     '將應扣金額相加'
  33.         a1 = Val(.TextBox11)
  34.         b1 = Val(.TextBox12)
  35.         c1 = Val(.TextBox13)
  36.         d1 = Val(.TextBox14)
  37.         e1 = Val(.TextBox15)
  38.         f1 = Val(.TextBox22)
  39.         g1 = Val(.TextBox16) * Val(.TextBox17)
  40.         h1 = Val(.TextBox18) * Val(.TextBox19)
  41.         i1 = Val(.TextBox20) * Val(.TextBox21)
  42.     '顯示應扣金額小計'
  43.         Sh.Range("Y3").Value = a1 + b1 + c1 + d1 + e1 + f1 + g1 + h1 + i1
  44.         .Label42 = Sh.Range("Y3")
  45.     '顯示實支金額'
  46.         .Label16 = .Label19 - .Label42
  47.         'Sh.Range("Y3")-Sh.Range("L3")   儲存格為空白時自動轉為 0
  48.        End With
  49. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 4# GBKEE


   感謝版主的熱心回覆,試過之後沒有出現之前的問題了,

但是有些語法我還不太清楚要在什麼時候用,以及他的意思,正在補強資料中@_@

另外想問,如果我要在表格中向下新增資料,是否要多一個一個向下偵測最後儲存格的程式

類似像這樣的
ActiveCell.End(xlDown).Select
        LastRec = ActiveCell.Row

還是可以利用for...next...迴圈也能解決?

是否請各位能給點提示就好,剩下的我再去試試看

另外貼程式碼的時候 要選哪個選項才能有左邊的編號?像版主回覆的那樣?是代碼嗎?

謝謝各位

TOP

本帖最後由 GBKEE 於 2013-9-16 16:33 編輯

回復 5# wxad0285
  多看看,會看出竅門的
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 6# GBKEE


感謝版主大的回覆,重複想了想,也查了資料,
有些地方總算是弄清楚,但還是有幾個問題我想再請教一下

1.有關於迴圈的部分
xRow = Application.CountA(Sh.Range("a:a"))            '有資料儲存格的計數
   With Sh
         .Cells(xRow + 1, "A") = xRow - 1
For i = 1 To 12
            '將應支金額填入,並相對應excel的儲存格' 1-10
            If i <= 10 Then .Cells(xRow + 1, "A").Offset(, i) = UserForm1.Controls("Textbox" & i)
            '將應扣金額填入,並相對應excel的儲存格' 11-22
            .Cells(xRow + 1, "M").Offset(, i - 1) = UserForm1.Controls("Textbox" & i + 10)
  Next
    End With

我可以將它解釋成
"當 i 小於等於10,儲存格會從("A & xRow+1)為起始點,向右移動 i 格,並且將 userfome1中第 i 個textbox的內容填入 "
但是下一句將這樣邏輯套用進去就滿奇怪?
所以不知道是不是我的認知有錯誤,是否能請各位大大幫我解釋一下,謝謝

2.當我在計算小計的時候,原本的程式碼如下:
  Sh.Range("L3").Value = a + b + c + d + e
        .Label19 = Sh.Range("L3")

但這樣不管輸入幾個人的資料,小計只會出現在L3這個
因此我作了以下修改:
sh.Range("L" & xRow + 1) = a + b + c + d + e
        .Label19 = sh.Range("L" & xRow + 1)

這樣就把問題解決了,但是我不懂的是,在寫.Cells()和.Range()儲存格方式是否有不同?
.Cell(xRow+1, "A")和.Range("A" & xRow+1)這兩者所代表的意思也不同嗎?
因為當我把前面寫.Cell儲存格的方式,寫入.Range中,也就是.Range(xRow+1, "A")
會出現
"執行階段錯誤1004,應用程式或物件定義的錯誤"
意思就是指我對.Range的寫法錯誤了嗎?

恩,以上兩個問題,還請大家不吝指教
如果問的問題過於淺顯,還是各位大大見諒

謝謝

TOP

回復 7# wxad0285
不錯,vba要進步就是要如此研究
  1. Range 集合
  2. 代表某一儲存格、某一欄、某一列、某一指定範圍 (該指定範圍可包含一個或若干連續儲存格範圍) 或者某一立體範圍。
複製代碼
Cells(列索引,欄索引)  ->Cell(xRow+1, "A")   , 列索引必須是數字,欄索引可以是數字或文字
  1. Option Explicit
  2. Sub Ex()
  3.   With Range("D10:F15")
  4.     .Select
  5.     MsgBox .Range("A" & .Rows.Count).Address
  6.     MsgBox .Cells(.Rows.Count, 1).Address
  7.     MsgBox .Range("C6").Address
  8.     MsgBox .Cells(.Rows.Count, .Columns.Count).Address
  9. End With
  10. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 8# GBKEE

感謝版主的細心地回覆

本來剛剛要問的迴圈問題,想說再看一次

結果就忽然看懂了,不枉我之前想到腦袋快燒焦

關於迴圈

只是我後面的敘述沒有一起看,以為是分段的

另外後面幫我補充的我也記下來了

再次感謝

現在正在從版上學習更多用法

希望之後有問題,還請各位大大幫小弟解答

謝謝~

TOP

        靜思自在 : 稻穗結得越飽滿,越會往下垂,一個人越有成就,就要越有謙沖的胸襟。
返回列表 上一主題