VBA - cách gửi giá trị từ chương trình chính vào chương trình còn

Liên hệ QC

pikachubr007

Thành viên mới
Tham gia
11/6/10
Bài viết
11
Được thích
0
hi mọi người. cho mình hỏi tí.
trong VBA, làm thế nào để gửi giá trị của một biến từ 1 chương trình chính vào 1 chương trình con để xử lý. chương trình của mình vd như bên dưới

sub test()
dim i as interger

i= 1

do until (điều kiện....)

- xử lý chương trình trong đó có biến (i)

- gọi chương trình con (chương trình con có biến i này, và lấy giá trị của biến i để xử lý)

i=i+1

loop
end sub.

vòng lặp tiếp tục và biến i bị thay đổi, chương trình con vẫn hiểu.

ban nào biết thì chỉ giúp nhé. thanks
 
Trước khi gọi chương trình con bạn gán j=i và lấy j vào chương trình con để xử lý thử xem, vì không biết chương trình con của bạn như thế nào nên không chắc chắn được. Lưu ý khai báo biến j
 
Upvote 0
hi mọi người. cho mình hỏi tí.
trong VBA, làm thế nào để gửi giá trị của một biến từ 1 chương trình chính vào 1 chương trình con để xử lý. chương trình của mình vd như bên dưới

sub test()
dim i as interger

i= 1

do until (điều kiện....)

- xử lý chương trình trong đó có biến (i)

- gọi chương trình con (chương trình con có biến i này, và lấy giá trị của biến i để xử lý)

i=i+1

loop
end sub.

vòng lặp tiếp tục và biến i bị thay đổi, chương trình con vẫn hiểu.

ban nào biết thì chỉ giúp nhé. thanks
Có phải na ná thế này không?
PHP:
Option Explicit
Public i As Long
Sub Main()
   i = 1
   Do Until i = 10
   SubMain
   i = i + 1
Loop
End Sub
Sub SubMain()
   MsgBox i + 1
End Sub
 
Upvote 0
ah giờ mình bị như thế này. ban đầu chưa khai báo biến toàn cục như quanghai1969:
Option Explicit
Public i As Long

và chương trình chính như dưới:

Sub Test()
Dim acad As Object
Dim polylineL1, polylineL2, polylineL3, polylineL4, structure As AcadLWPolyline
Dim wideladder, materialthick As Double
Set lengthL1 = Sheets(1).Range("D6").Cells
Set lengthL2 = Sheets(1).Range("E6").Cells
Set lengthL3 = Sheets(1).Range("F6").Cells
Set lengthL4 = Sheets(1).Range("G6").Cells
Set Supportname = Sheets(1).Range("H6").Cells
Set ToadoX = Sheets(2).Range("F3").Cells
Set ToadoY = Sheets(2).Range("G3").Cells

Dim pointL1(0 To 9) As Double
i = 1
Do Until (lengthL1(i, 1) = "")
pointL1(0) = ToadoX(i, 1): pointL1(1) = ToadoY(i, 1)
pointL1(2) = ToadoX(i, 1): pointL1(3) = ToadoY(i, 1) + lengthL1(i, 1)
pointL1(4) = ToadoX(i, 1) + materialthick: pointL1(5) = ToadoY(i, 1) + lengthL1(i, 1)
pointL1(6) = ToadoX(i, 1) + materialthick: pointL1(7) = ToadoY(i, 1)
pointL1(8) = ToadoX(i, 1): pointL1(9) = ToadoY(i, 1)
e(0) = ToadoX(i, 1) + 6#: e(1) = ToadoY(i, 1) + lengthL1(i, 1)
f(0) = ToadoX(i, 1) + 6#: f(1) = ToadoY(i, 1)
d1(0) = pointL1(4): d1(1) = pointL1(5)
d2(0) = pointL1(6): d2(1) = pointL1(7)
locationl1(0) = ToadoX(i, 1) + 175: locationl1(1) = (ToadoY(i, 1) + lengthL1(i, 1)) / 2

Set acad = GetObject(, "autocad.application")
Set polylineL1 = acad.ActiveDocument.ModelSpace.AddLightWeightPolyline(pointL1)
end sub

ban đầu chưa khai biến toàn cục thì chương trình chạy ok. nhưng khi khai biến thì toàn báo lỗi ở line này Set lengthL1 = Sheets(1).Range("D6").Cells

mình tính đưa cả chương trình trên vào 1 chương trình con, do có nhiều chương trình khác nữa. nhưng test thử thì báo lỗi.
bạn biết chỉ giúp nhé. thanks
 
Upvote 0
ah giờ mình bị như thế này. ban đầu chưa khai báo biến toàn cục như quanghai1969:
Option Explicit
Public i As Long

và chương trình chính như dưới:

Set lengthL1 = Sheets(1).Range("D6").Cells

Câu lệnh Set lengthL1 = Sheets(1).Range("D6").Cells mang ý nghĩa gì vậy? Sao mình chưa dùng lần nào.
 
Upvote 0
ah tức là mình lấy giá trị ở excel với sheet(1) tại cột D6
lúc này giá trị lengthL1(1,1) = giá trị ở cột D6, và lengthL2(2,1) có giá trị ở cột D7 ....
vì thế mình mới cần thay đổi biến i toàn cục. sử dụng các giá trị ở cột D, từ D6 trở đi: lengthL1(i,1)
 
Lần chỉnh sửa cuối:
Upvote 0
mình vd thế này.

bạn mở 1 file excel nhập giá trị tuỳ ý trên sheet 1 cột B1, B2, B3....B10

viết code thế này

Sub test()
Set a = Sheets(1).Range("B1").Cells
Dim i As Integer
i = 1
Do Until i = 10
b = a(i, 1)
MsgBox b
i = i + 1
Loop
End Sub
 
Upvote 0
Biến toàn cục không ai dùng những tên đơn giản và thông dụng như i, j cả. Chỉ cần gọi vài sub's là lộn tét bét ra hết.

Để truyền trị số i cho hàm con, trong ký thuật lập trình có cái gọi là tham số. Chỉ cần sửa chỗ khaoi báo hàm con là:

Sub HAM_CON()

sửa thành

Sub HAM_CON(byRef i As Integer)

Đoạn code của hàm chính gọi hàm con, sửa:

HAM_CON ' không có tham số

thành:

HAM_CON i ' truyền tham sô là i

byRef : nếu bên trong HAM_CON cần thay đổi trị của i thì dùng từ khoá byRef. Nếu bên trong hàm này không cần thay đổi trị của i thì dùng từ khoá byVal.
Cái khác nhau là từ khoá byVal minh đinh rằng HAM_CON sẽ lấy một copy của i để làm việc. Những gì nó thay đổi trên i là thay đổi ở copy này, trị i của hàm chính không hề thaty đổi. Ngược lại từ khoá byRef minh định rằng HAM_CON làm việc thẳng trên tham số i, chả hề copy lại.
 
Lần chỉnh sửa cuối:
Upvote 0
thanks Vietmini. mình hiểu rồi. nhưng giờ mình muốn truyền thông số ở dưới cho hàm con thì sao nhỉ.
Set a = Sheets(1).Range("B1").Cells

chương trình ví dụ cuả mình như bên dưới nhé.

Sub test()
Set a = Sheets(1).Range("B6").Cells
Dim i As Integer
i = 1
Do Until a(i, 1) = ""
testcon i
i = i + 1
Loop
End Sub


Sub testcon(ByRef i As Integer)
Set a = Sheets(1).Range("B6").Cells
b = a(i, 1)
MsgBox b


End Sub
 
Upvote 0
mình đã tìm đc cách viết như bên dưới. nhưng có vẻ ko pro cho lắm. bạn có cách nào hay hơn thì chỉ mình với nhé. thanks


Sub test()

Set a = Sheets(1).Range("B6").Cells
Dim i As Integer, b as string
i = 1
Do Until a(i, 1) = ""
b=a
testcon i,b

i = i + 1
Loop
End Sub


Sub testcon(ByRef i As Integer,byref b as string)
MsgBox b
End Sub
 
Upvote 0
mình đã tìm đc cách viết như bên dưới. nhưng có vẻ ko pro cho lắm. bạn có cách nào hay hơn thì chỉ mình với nhé. thanks


Sub test()

Set a = Sheets(1).Range("B6").Cells
Dim i As Integer, b as string
i = 1
Do Until a(i, 1) = ""
b=a
testcon i,b

i = i + 1
Loop
End Sub


Sub testcon(ByRef i As Integer,byref b as string)
MsgBox b
End Sub

1. Muốn viết code thì bạn phải có cơ bản đã. Sao nhiều người muốn đốt cháy giai đoạn thế nhỉ?
Bạn còn chưa biết gì về function, sub (gọi là chương trình???), tham số là gì ...
2. Dụng ý bạn định làm gì?
Trước hết code trên chắc chắn không làm cái mà tôi nghi là bạn muốn. Vì nếu b = a thì khi bạn thay đổi i thì b không thay đổi. Vì b = a, tức viết tường minh thì b = a.Value = giá trị của B6, không thay đổi khi i thay đổi. Nếu dụng ý là hiển thị các ô liên tiếp thì phải là b = a(i, 1).Value.
Chú ý là bạn nên viết tường minh. Không có gì phải bắt chước người khác. Cái này nó không phải là thói quen tốt mà. Viết tường minh và dùng các "tên hằng" của Excel thay cho 1, 2, 3, 4, ... Code toàn những 1, 2, 3, 4, ... rất "tối".
3. Về sub testcon thì nếu bạn không dùng tới i thì chả lý gì lại truyền i, tức với code hiện thời thì bỏ tham số i.
Mặt khác nhu cầu không cần thay đổi b thì không dùng ByRef. Bạn nên chú ý ngay từ đầu.
Ngoài ra bạn không bắt buộc phải dùng thêm biến b. Có thể truyền ngay a(i, 1).Value.Vậy có thể sửa thành

Mã:
Sub test()
Dim i As Integer, a As Range
    Set a = Sheets(1).Range("B6")
    i = 1
    Do Until a(i, 1) = ""
        testcon a(i, 1).Value
        i = i + 1
    Loop
End Sub

Sub testcon(ByVal b As String)
    MsgBox b
End Sub
 
Upvote 0
thanks bạn nhiều. thật ra mình mới học VB đc khoảng 1 tháng. dự án mình làm là nhập vào thông số rồi xuất bản vẽ shop drawing tự động. vì ko có nhiều thời gian nên đành phải học nhưng gì mình cần. chương trình chính mình đã viết đc ok, nhưng khó quản lý, nên cần viết chương trình con cho dễ quản lý.
 
Upvote 0
[Thongbao]thanks bạn nhiều. thật ra mình mới học VB đc khoảng 1 tháng. dự án mình làm là nhập vào thông số rồi xuất bản vẽ shop drawing tự động. vì ko có nhiều thời gian nên đành phải học nhưng gì mình cần. chương trình chính mình đã viết đc ok, nhưng khó quản lý, nên cần viết chương trình con cho dễ quản lý.[/Thongbao]


Lúc rỗi bạn có thể đến đây tham khảo thêm (Từ #9 trở đi):

http://www.giaiphapexcel.com/forum/showthread.php?650-Chập-chững-đến-VBA!
 
Upvote 0
Tách chương trình nhỏ thành nhiều chương trình con để dễ quản lý là kỹ thuật rất thông dụng.
Tuy nhiên, nếu bạn không chịu khó tìm hiểu sâu về cách sử dụng tham số thì các chương trình con của bạn chỉ mang tính chất "một chương trình lớn cắt nhỏ ra từng đoạn" chứ không thể gọi là chương trình con được.

Nếu muốn viết chương trình con thì phải biết cách sử dụng tham số. Chấm hết.
 
Upvote 0
Dịch thô từ ngôn ngữ bài này sang VBA là như sau

Tách chương trình thành nhiều chương trình con để dễ quản lý là kỹ thuật rất thông dụng.
Tuy nhiên, nếu bạn không chịu khó tìm hiểu sâu về cách sử dụng tham số thì các chương trình con của bạn chỉ mang tính chất "một chương trình lớn cắt nhỏ ra từng đoạn" chứ không thể gọi là chương trình con được.

Nếu muốn viết chương trình con thì phải biết cách sử dụng tham số. Chấm hết.

PHP:
Sub Test()
 Dim I As Integer, A As Range

 Set A = Sheets(1).Range("B6")
 I = 1
 Do Until A(I, 1) = ""
    TestCon A(I, IIf(I Mod 2 = 0, 1, 2)).Value
     I = I + 1
  Loop
End Sub

Mã:
[B]Sub TestCon(ByVal b As String)[/B]
    MsgBox b,, "GPE.COM"
[B]End Sub[/B]
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom