Xin chỉ giúp. Tôi gặp vấn đề sau : Khi tạo một macro
Ví dụ
A1 =6
B1 = 7
C1 = 8
D1 = A1+B1
ENTER
Thì ta có macro
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 9/2/2005 by user02
'
'
ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]"
Range("D2").Select
End Sub
Vậy thì bằng cách nào để cho "Range("D2").Select "không phải là D2, vì khi thực hiện macro này thì kết thúc lệnh ô hiện hành là ô D2 ( cho dù vị trí thực hiện nào đi nữa).
Có nghĩa là ta phải thay đổi dòng Range("D2").Select "như thế nào để nó không phải là địa chỉ tuyệt đối như vậy. Ví dụ thực hiện lệnh ở ô D3 (sử dụng macro trên )thì kết thúc lệnh ô hiện hành ở D4, chứ không phải là D2
Nếu bạn không muốn nó select tại địa chỉ tuyệt đối là "D2" thì
1- Bỏ dòng sau đây đi Range("D2").Select
2- Thay giá trị "D2" bằng giá trị khác qui định trong biến
Ví dụ:
Dim AddCell as long
AddCell=3
Range("D" & AddCell ).Select
Chúc bạn thành công
Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
Email : cncc.jsc@gmail.com
chào các bác!
Em rất muốn học VBA cho thằng Excel này
thấy các bác post lên nhiều nhiều em thật sự rất vui
Em có một thỉnh cầu nho nhỏ này:
Đằng nào các bác cũng dành thời gian viết bài và post lên, vậy trong khi viết hàm nào đó các bác có thể giải thích rõ hơn một chút được không, để cho anh em nào (như em chẳng hạn) muốn đọc code cũng hiểu được nhiều, rất cảm ơn các bác
PMXD thân mến
Tôi có đọc 2 hàm :Tra A,B,D và tính bản sàn
Thế thì phức tạp quá.Hôm sau rãnh tôi post lên các bạn cho ý kiến nhé:
1/ Hàm tra A,B,D toằn bộ có công thức rồi chỉ dùng excel thông thường là tính thẳng ra A,B,D và Rtc luôn
2/ Bản sàn thì dùng một chút công thức nội suy thì ra luôn nội lực
Đâu cần phức tạp đến thế
Anh rất cám ơn ông em. Nhưng anh muốn biết thuật toán của Smoothed line. Hình như nó cài theo dạng *.xla nên anh kô thể xem đc, em có cách naog giúp anh đc ko vẩy
Đó là Excel 4.0, anh muốn xem thì vào Properties của ThisWorkbook đặt IsAddin=False, nhưng trong đó cũng không có thuật toán như anh cần đâu.
Smooth line của Excel là dạng đồ thị bậc 3 đi qua các điểm kiểm soát, anh có thể xem nhiều dạng làm trơn khác trong các sách nói về Kỹ thuật đồ họa (Hermite, Bezier...). Em có 1 ít tài liệu nói về phần này, anh có thể tham khảo nhưng nó chưa thật chuẩn so với Smooth line của Excel.
Các bác cho em hỏi bên VB một chut (em mới bắt đầu học nên còn kém lắm,các bác thông cảm nhé)
1.Làm thế nào để xuất kết quả ra dưới dạng.txt ,dưới dạng.xls?
2.Có phải VB không thể tạo được cơ sở dữ liệu (Đơn giản như 1 bảng tra chẳng hạn) mà bắt buộc phải dùng Access không?Kết nối như thế nào?
Bác PMXD hàm nội suy của bác gặp sự cố rồi (không biết có phải thế không!?). Mình nêu ra trường hợp nhé: khi bác nhập giá trị "Cot" là các số nằm trong cột đó (VD:cột là dãy số:0,1; 0,25; 0,5;0,75;1 thì nhập chính xác số có trong cột là 0,25) và khi nhập giá trị "Hang" là số không có trong Hàng đó (VD: Hàng có dãy 1;2;3;4 mà nhập số cần nội suy la 2,1) thì kết quả trả về 0. Đây là điều bất tiện trong phương pháp nội suy vì không đáp ứng tính bất kì của một hàm số nội suy. Mong Bác có câu trả lời giụp Nhân đây mình xin gửi lại file Bác đã post lên nhưng mình đã sửa giá trị tương ứng với trường hợp nêu trên để Bac tham khảo để giải quyết nhanh.
Mình đã xem lại code của PMXD và nhận thấy thừa ra 1 đoạn ở đầu, bạn dùng thử xem sao:
Function TraBang2Chieu(ByVal GiaTriCot, ByVal GiaTriHang, VungChon As Range)
Dim i As Long, j As Long
Dim TangAnPha
Dim NoiSuy1 As Double, NoiSuy2 As Double
For i = 1 To UBound(VungChon.Value, 2)
If (GiaTriCot - VungChon(1, i)) * (GiaTriCot - VungChon(1, i + 1)) <= 0 Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) <= 0 Then
TangAnPha = (NoiSuy2 - NoiSuy1) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = NoiSuy1 + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
End If
Next i
Thoat:
End Function
Tuy nhiên mình nhận thấy cách tra bảng này chỉ thực hiện nội suy thì được thôi, chứ ngoại suy thì not OK.
Tôi thấy chủ đề các bác mở ra là mỗi tuần một hàm Excel, nhưng đọc toàn thấy VB thôi à. Mà viết vài cái lệnh VB thì đâu có khó và chả liên quan gì đến Excel cả. Với các hàm này các bác cứ tự nhiên vào AutoCAD, Word, PowerPoint... hay cái quái gì mà chả dùng được.
Tôi thấy bọn lớp 48 CLC trường Xây dựng được dùng Excel để tính móng nông (có tra bảng, có vẽ biểu đồ ứng suất...) mà toàn dùng đúng các hàm của Excel thôi à (không hề có VB).
Xin mạn phép góp ý với bác PMXD là bác nên mở thêm một chủ đề về lập trình VB thì thích hợp hơn, lúc đó sẽ có nhiều dân IT vào đấy.
Từ trước đến giờ em toàn dùng excel để thực hiện.Không cần VBA đâu.Tuy hơi dài 1 chút nhưng chơi được mọi bài toán hết.Chỉ cần sáng tạo chút thôi.Ai thích thì em gửi mấy công thức nội suy trong bảng tra cơ đất cho.Chỉ dùng match và index là chơi được cả 1 chiều và 2 chiều hết.Dĩ nhiên là có hàm sẽ nhanh hơn nhưng ai chưa kịp học cũng có thể dùng ngay mà không cần đi nghiên cứu VBA.
bác PMXD thật tâm lý. em đang là sinh viên, học tàng tàng,ko bit VBA nên xin cái bác làm sẵn về dùng lại thấy hay. ai có thể cho mình bit về lập trình VBA ko, kiến thức từ thấp tới cao í
1- Tên hàm: Facot
2- Các tham số chính
M- Mô men (Kgm)
N- Lực dọc (Kg)
b- Bề rộng tiết diện (m)
h- Chiều cao tiết diện (m)
ao- Chiều dày lớp bảo vệ cốt thép
l - Chiều dài (thực tế) cột
Mdh- Thành phần momen dài hạn
Ndh- Thành phần lực dọc dài hạn
MBT- Mác bê tông (nếu ko nhập thì giá trị mặc định là 250)
KieuCotThep- Loại cốt thép (nếu ko nhập thì giá trị mặc định là "AII")
Kieulienket- Hình thức liên kết cua cột
= 1 : hai đầu ngàm
= 2 : hai đầu khớp
= 3 : 1 đầu ngàm, một đầu khớp
= 4 : 1 đầu ngàm, 1 đầu tự do
3- Thuật toán tổng thể của hàm
- Tính toán các thông số ban đầu
- Giả thiết giá trị hàm lượng cốt thép (Muy) ban đầu
- Tính toán giá trị Muy thực tế
- So sánh, tính lặp cho đến khi Muy giả thiết xấp xỉ Muy tính toán
- Tính diện tích cốt thép theo giá trị Muy cuối cùng
- So sánh với diện tích thép tính theo bài toán kéo (nén) đúng tâm
- Lấy giá trị Max của hai trường hợp
4- Nội dung của hàm
Function FaCot(ByVal M As Double, ByVal N As Double, ByVal b As Double, h As Double, _
ByVal ao As Double, ByVal l As Double, Optional Mdh = 0, Optional Ndh = 0, Optional MBT = 250, Optional KieuCotThep = "AII", Optional KieuLienKet = 1)
'============================Don vi tinh toan Kg,m
Dim Lo As Double 'Chieu dai tinh toan cua cau kien(m)
Dim ho As Double
Dim Muy As Double, nuy As Double, MuyGt As Double, NuyMin As Double
Dim Eo As Double, e As Double, eogh As Double, X As Double
Dim s As Double, Nth As Double
Dim Ja As Double, Jb As Double
Dim Phi As Double
Dim Kdh As Double
Dim MuyMin As Double
Dim Rn As Double, Rk As Double, Eb As Double, Ra As Double, Rad As Double, Ea As Double
Dim Fat As Double, HamLuongCot As Double
Dim Fadungtam As Double
If M <> 0 Then Kdh = 1 + Mdh / M
'==============================Xac dinh chieu dai tinh toan cua cot
Select Case KieuLienKet
Case 1 ' Hai dau ngam
Lo = 0.7 * l
Case 2 ' Hai dau khop
Case 3 'Dau ngam dau khop
Case 4 ' Dau ngam va Dau tu do
End Select
'==============================Xac dinh cac thong so cua be tong va thep
BeTong MBT, Rn, Rk, Eb
CotThep KieuCotThep, Ra, Rad, Ea
ho = h - ao
Phi = PhiUD(Lo, b, "R")
FaCot = 0: Fat = 0
If N = 0 Then
FaCot = 0: Fat = 0
ElseIf M = 0 And N < 0 Then
'================================Tinh toan cau kien chiu nen trung tam tiet dien chu nhat
N = Abs(N)
FaCot = ((N / Phi - Rn * b * h)) / Ra
Fat = ((N / Phi - Rn * b * h)) / Ra
Muy = 100 * (FaCot + Fat) / (b * ho)
'==========================================================================
ElseIf M <> 0 And N < 0 Then
'==================================Tinh toan cau kien chiu nen lech tam tiet dien chu nhat
M = Abs(M)
N = Abs(N)
'===== Tinh cho truong hop bo qua Momen
Fadungtam = ((N / Phi - Rn * b * h)) / Ra
'===============================
MuyGt = 2 * MuyMin
Muy = MuyGt
Do
MuyGt = (MuyGt + Muy) / 2
If MuyGt < 0 Then Exit Do
Jb = b * h ^ 3 / 12
Ja = 0.01 * MuyGt * b * (h - ao) * (0.5 * h - ao) * (0.5 * h - ao)
'===================================Tinh toan do lech tam eo
If b > 0.25 And h / 25 > 0.02 Then
Eo = (M / N + h / 25)
ElseIf b > 0.25 And h / 25 < 0.02 Then
Eo = (M / N + 0.02)
ElseIf b < 0.25 And h / 25 > 0.015 Then
Eo = (M / N + h / 25)
ElseIf b < 0.25 And h / 25 < 0.015 Then
Eo = (M / N + 0.015)
End If
'================================ Tinh he so anh huong den do lech tam
If Eo < 0.05 * h Then
s = 0.84
ElseIf 0.05 * h <= Eo < 5 * h Then
s = 0.11 / (0.1 + Eo / h) + 0.1
Else
s = 0.122
End If
Nth = 6.4 * ((s * Jb * Eb / Kdh) + Ea * Ja) / (Lo * Lo)
nuy = 1 / (1 - (N / Nth))
If nuy < 0 Then FaCot = "ThiÕu thÐp": Exit Function
eogh = 0.4 * (1.25 * h - Anpha(MBT) * ho)
X = N / Rn / b
If X < Anpha(MBT) * (h - ao) Then
'====================================Tinh toan lech tam lon
If X < 2 * ao Then
FaCot = N * (nuy * Eo - 0.5 * h + ao) / Ra / (ho - ao)
ElseIf X > 2 * ao And X < Anpha(MBT) * ho Then
e = nuy * Eo + 0.5 * h - ao
FaCot = N * (e - ho + 0.5 * X) / (Ra * ho - Ra * ao)
Else
GoTo TinhTheoLechTamBe
End If
Else
TinhTheoLechTamBe:
'=====================================Tinh toan lech tam be
If nuy * Eo <= 0.2 * ho Then
X = h - (1.8 + 0.5 * h / ho - 1.4 * Anpha(MBT)) * Eo
Else
X = 1.8 * (eogh - Eo) + Anpha(MBT) * ho
End If
e = 0.5 * h + nuy * Eo - ao 'Khoang cach tu luc doc den trong tam cot thep chiu keo
FaCot = ((N * e - Rn * b * X * (ho - 0.5 * X)) / Ra / (ho - ao))
End If
'====================================Kiem tra ham luong cot thep
Muy = 200 * FaCot / (b * ho)
Loop Until Abs(Muy - MuyGt) < 0.05
Fat = FaCot
ElseIf M = 0 And N > 0 Then
'===================================Tinh toan cau kien chiu keo trung tam
M = Abs(M)
N = Abs(N)
FaCot = 0.5 * N / Ra
Fat = 0.5 * N / Ra
Muy = 100 * (FaCot + Fat) / (b * ho)
ElseIf M <> 0 And N > 0 Then
M = Abs(M)
N = Abs(N)
Eo = M / N
If Eo <= 0.5 * h - ao Then
'===================================Tinh toan cau kien chiu keo lech tam be
Fat = N * (0.5 * h - Eo - ao) / Ra / (ho - ao)
FaCot = N * (0.5 * h + Eo - ao) / Ra / (ho - ao)
Fat = TimMax(Array(Fat, FaCot))
FaCot = TimMax(Array(Fat, FaCot))
Muy = 100 * (FaCot + Fat) / (b * ho)
Else
'==================================Tinh toan cau kien chiu keo lech tam lon
X = Anpha(MBT) * ho
Fat = (N * (Eo + 0.5 * h - ao) - Anpha(MBT) * (1 - 0.5 * Anpha(MBT)) * Rn * b * ho * ho) / Ra / (ho - ao)
FaCot = (N + Anpha(MBT) * Rn * b * ho + Ra * Fat) / Ra
Fat = TimMax(Array(Fat, FaCot))
FaCot = TimMax(Array(Fat, FaCot))
Muy = 100 * (FaCot + Fat) / (b * ho)
End If
End If
FaCot = TimMax(Array(FaCot, Fadungtam))
If Muy < 1 Then
Muy = 1
Fat = Muy * b * ho / 200
FaCot = Muy * b * ho / 200
Fat = Fat * 10 ^ 4
FaCot = FaCot * 10 ^ 4
Else
FaCot = FaCot * 10 ^ 4
Fat = Fat * 10 ^ 4
End If
End Function[/QUOTE]
xem hộ cái dòng màu đỏ cái.
Ghi chú