Hỏi đáp VBA trong chủ đề "Chập chững đến VBA"

Liên hệ QC

luongchihien

Thành viên mới
Tham gia
26/8/11
Bài viết
7
Được thích
1
Điểm
0
Em xem đề tài và học hỏi được một tí, với yêu cầu như vậy! Trong file excel có sheet "Form" và sheet "Thong Tin KH" bây giờ em muốn nhập vào form (từ ô D4: D32, như trong file) rồi enter thì dữ liệu được nhập vào sheet "Thong Tin KH". Mong mọi người giúp đỡ
Em mò mẫn mãi mà ko ra ( em làm được cái gì là đính kèm hết trong file đó. gồm file excel và word chứa code)
Cảm ơn trước, cho những ai giúp đỡ!
 

File đính kèm

  • aa.xlsx
    35.8 KB · Đọc: 57
  • Code nhập vào Module.doc
    31.5 KB · Đọc: 70
Hix, từ trước tới giờ dùng excel cũng như là word thôi, chỉ biết gõ chữ.
Nay đào được cái bài này cứ nghĩ là sẽ có cơ hôi học hỏi thêm.
Ôi thì mình chập chững như đứa trẻ đang tập đi trong nhà, được bác SA_QD dẫn đi từng bước với những ví dụ đơn giản trong cuộc sống, rồi phím tắt để vào cửa sổ Immediate. Hướng dẫn gõ từng code và giải thích cặn kẽ. Thật dễ tiếp thu biết bao nhiêu.
Sang ngày hôm sau. Chỉ 1 ngày thôi. 1 thành phố đập vào mắt với bao cơ man là Macro, PHP Code, Hàm, Biến …..
Đứa trẻ đã bị bỏ rơi, lang thang , bơ vơ không biết níu vào đâu.
Dập tắt 1 ước vọng tập đi :(
 
Upvote 0
Em xem đề tài và học hỏi được một tí, với yêu cầu như vậy! Trong file excel có sheet "Form" và sheet "Thong Tin KH" bây giờ em muốn nhập vào form (từ ô D4: D32, như trong file) rồi enter thì dữ liệu được nhập vào sheet "Thong Tin KH". Mong mọi người giúp đỡ
Em mò mẫn mãi mà ko ra ( em làm được cái gì là đính kèm hết trong file đó. gồm file excel và word chứa code)
Cảm ơn trước, cho những ai giúp đỡ!

Cái này đâu cần phải dùng code dài thoòng loòng như vậy chứ! Chỉ cần vầy thôi:

PHP:
Private Sub CommandButton1_Click()
  Dim MyArr, MyRng As Range
  MyArr = WorksheetFunction.Transpose(Sheets("Form").Range("C4:C34").Value)
  Set MyRng = Sheets("Thong Tin KH").Range("B65536").End(xlUp)
  If MyRng.Address = "$B$4" Then Set MyRng = MyRng.Offset(2) Else Set MyRng = MyRng.Offset(1)
  MyRng.Resize(, 31) = MyArr
  Set MyRng = Nothing
End Sub

Bạn xem File nhé!
 

File đính kèm

  • NhapDuLieu.rar
    42.4 KB · Đọc: 181
Upvote 0
Trước tới giờ dùng excel cũng như word thôi, chỉ biết gõ chữ.
Nay đào được cái bài này cứ nghĩ là sẽ có cơ hôi học hỏi thêm.
Ôi thì mình chập chững như đứa trẻ đang tập đi trong nhà, được bác SA_QD dẫn đi từng bước với những ví dụ đơn giản trong cuộc sống, rồi phím tắt để vào cửa sổ Immediate. Hướng dẫn gõ từng code và giải thích cặn kẽ. Thật dễ tiếp thu biết bao nhiêu.
Sang ngày hôm sau. Chỉ 1 ngày thôi. 1 thành phố đập vào mắt với bao cơ man là Macro, PHP Code, Hàm, Biến …..
Đứa trẻ đã bị bỏ rơi, lang thang , bơ vơ không biết níu vào đâu. Dập tắt 1 ước vọng tập đi :(

Diễn đàn mà bạn, có fải là quyễn sách bạn mua đâu? Bạn thay vì ngồi trách ai đó thì để thời gian tìm hiểu fương thức nào đó đề tự học để tiếp thu kho tàng trên GPE.COM thì hay hơn!

(húc thành công nay mai!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Xin đuợc các cao thủ cho ý kiến , tôi có vấn đề là trên 1 sheet excel tôi có rất nhiều checkbox
nếu checkbox nào được đánh thì tổng được 1 còn ngược lại tổng là 0

PHP:
If CheckBox1.Value = True Then
           DIEM =  1
else
          DIEM =  0
End If

If CheckBox2.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

If CheckBox3.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

...............
tất cả những thao tác trên là như nhau chỉ khác nhau checkbox,
nếu làm như vậy thì rất cực và lâu tôi muốn dùng 1 hàm để gọi tất cả nhưng không biết kiểu dữ liệu là gì mong các cao thủ cho ý kiến

PHP:
Fuction DIEM(bien as kiểu dữ liệu) as Integer
    lenh
    lenh
   lenh
kiểu dữ liệu ở đây là gì?
 
Upvote 0
Thử dùng vòng lặp xem? Duyệt qua tất cả các checkbox, dùng and hoặc or theo ý của mình.
 
Upvote 0
Theo kyo thì dùng Controls("checkbox" & i).value để lập thì sẽ tiết kiệm thời gian hơn. Giả sử có 10 cái checkbox được đánh số từ 1 đến 10

PHP:
For i=1 to 10
       If UserForm.Controls("checkbox" & i).value=True then
              diem=1
       else
              diem=0
       end if
next i
 
Upvote 0
Dạ cảm ơn, nhưng mà mình viết chương trình con thì hay hơn
 
Upvote 0
Xin đuợc các cao thủ cho ý kiến , tôi có vấn đề là trên 1 sheet excel tôi có rất nhiều checkbox
nếu checkbox nào được đánh thì tổng được 1 còn ngược lại tổng là 0

PHP:
If CheckBox1.Value = True Then
           DIEM =  1
else
          DIEM =  0
End If

If CheckBox2.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

If CheckBox3.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

...............
tất cả những thao tác trên là như nhau chỉ khác nhau checkbox,
nếu làm như vậy thì rất cực và lâu tôi muốn dùng 1 hàm để gọi tất cả nhưng không biết kiểu dữ liệu là gì mong các cao thủ cho ý kiến

PHP:
Fuction DIEM(bien as kiểu dữ liệu) as Integer
    lenh
    lenh
   lenh
kiểu dữ liệu ở đây là gì?
Bạn tổng hợp các checkbox đang check trên sheet, vậy đâu cần biến gì chứ
Có thể code thể này:
PHP:
Function Diem() As Long
  Dim cbx As OLEObject
  Application.Volatile
  For Each cbx In ActiveSheet.OLEObjects
    If cbx.progID = "Forms.CheckBox.1" Then
      If cbx.Object.Value Then Diem = Diem + 1
    End If
  Next
End Function
Lưu ý:
- Checkbox này là ActiveX control nằm trên sheet
- Phải bấm F9 để cập nhật khi có thay đổi
 
Upvote 0
Tôi thì viết kiểu khác:
Căn cứ theo các yêu cầu:

PHP:
If CheckBox1.Value = True Then
   DIEM =  1
else
   DIEM =  0
End If
If CheckBox2.Value = True Then
   DIEM =  1
else
   DIEM =  0
 End If

If CheckBox3.Value = True Then
   DIEM =  1
else
   DIEM =  0
End If
...............

Tôi viết vầy:

PHP:
Function Diem(n As Long) As Long
  Application.Volatile
Dim Ischeck As Boolean
  Ischeck = False
  For i = 1 To n
      Ischeck = Ischeck Or ActiveSheet.OLEObjects("Checkbox" & i).Object.Value
  Next
Diem = IIf(Ischeck, 1, 0)
End Function

Cú pháp hàm:
Nếu trên sheet có 5 checkbox:
=Diem(5)

Và có thể tính Diem(3), Diem(2) từ trên xuống dưới.

Tuy vậy, mỗi checkbox đều có thuộc tính LinkedCell, sau khi gán LinkedCells cho vùng A1:An, tôi chỉ cần dùng công thức thường của Excel cũng tính ra điểm:

TinhDiem.jpg


1. Chỉ cần 1 True là có 1 điểm, bao nhiêu True cũng chỉ 1 điểm:

=1*(SUMPRODUCT(A1:A6*1)>0)

2. Mỗi True 1 điểm:

=SUMPRODUCT(A1:A6*1)
 
Upvote 0
em có 1 bài xin anh em diễn đàn chỉ giúp là: vị trí 1b = 1a * i với i= 1 - 10 step 0.1, sao cho 1b<1c thì cho ra kết quả 1b,không thì kết quả là 1c
và tính hết cho các dòng trong excel.
ý nghĩa bài toán là với giá trị a nhập vào được giá trị b xuất ra, vậy b tăng lên bao nhiêu lần thì sẽ = c với i là hệ số an toàn để b đạt được c.
E mới làm được 1 hàng không biết sao làm được nhiều hàng xin mọi người giúp.
Em cảm ơn nhiều.
 

File đính kèm

  • hsat.xls
    29.5 KB · Đọc: 20
Upvote 0
em có 1 bài xin anh em diễn đàn chỉ giúp là: vị trí 1b = 1a * i với i= 1 - 10 step 0.1, sao cho 1b<1c thì cho ra kết quả 1b,không thì kết quả là 1c
và tính hết cho các dòng trong excel.
ý nghĩa bài toán là với giá trị a nhập vào được giá trị b xuất ra, vậy b tăng lên bao nhiêu lần thì sẽ = c với i là hệ số an toàn để b đạt được c.
E mới làm được 1 hàng không biết sao làm được nhiều hàng xin mọi người giúp.
Em cảm ơn nhiều.
Để tôi mô tả lại bài toán của bạn xem có đúng không nha:
- Với c là giá trị có sẵn
- Nhập vào giá trị a
- So sánh:
1> Nếu a >= c thì gán c vào b
2> Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b

--------------
Có phải đúng vậy không?
 
Upvote 0
Dạ bài toán em như vậy:
với 1 lực dọc gán vô (a) sẽ ra 1 lượng thép là (b)
Và chủ đầu tư cần thiết kế với hệ số an toàn dao động từ :1.1 - 2
nên em giả định hệ số này là i với chạy từ 1 đến 10 step 0.1
sao đó: b = a * i
so sánh b với c
tóm lại là:
- c có sẵn ok
- gán giá trị a
- b =a * i với i chạy từ 1 đến 10 step 0.1
sao cho
b <= c thì b=c
Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b--------------
sư phụ sửa cái code dùm em nhé..
Với anh cho em hỏi có chổ nào hay anh có dạy cái VBA này không hay anh có biết ở đâu dạy môn này chỉ em để đi học ...em dốt cái này lắm...
em cảm ơn anh nhiều.
Em lập 2 vòng
1 vòng cho K chạy theo dòng
i là hệ số an toàn chạy từ 1 đến 10 step 0.1
mà nó chỉ hiểu thằng k
không hiều thằng i......
 
Upvote 0
Đoán già đoán non thôi nhé: Có thể dùng 2 FOR lồng nhau.
Bạn nên biết cách chạy theo "vết" bằng mở cửa sổ Macro, chuyển điểm nháy đến macro cần chạy, gõ F8.
Khi nó tạm dừng, bạn có thể chuyển sang cửa sổ Excel để xem kết quả.
 
Upvote 0
Dạ bài toán em như vậy:
với 1 lực dọc gán vô (a) sẽ ra 1 lượng thép là (b)
Và chủ đầu tư cần thiết kế với hệ số an toàn dao động từ :1.1 - 2
nên em giả định hệ số này là i với chạy từ 1 đến 10 step 0.1
sao đó: b = a * i
so sánh b với c
tóm lại là:
- c có sẵn ok
- gán giá trị a
- b =a * i với i chạy từ 1 đến 10 step 0.1
sao cho
b <= c thì b=c
Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b--------------
sư phụ sửa cái code dùm em nhé..
Với anh cho em hỏi có chổ nào hay anh có dạy cái VBA này không hay anh có biết ở đâu dạy môn này chỉ em để đi học ...em dốt cái này lắm...
em cảm ơn anh nhiều.
Em lập 2 vòng
1 vòng cho K chạy theo dòng
i là hệ số an toàn chạy từ 1 đến 10 step 0.1
mà nó chỉ hiểu thằng k
không hiều thằng i......

Đoán và làm đại... hên thì trúng
PHP:
Sub Test()
  Dim n As Double, lR As Long, tmp As Double, tmpVal As Double
  On Error Resume Next
  With Range("A1:C10000")
    sArray = .Value
    For lR = 1 To UBound(sArray, 1)
      n = 1
      If sArray(lR, 1) <> "" Then
        tmpVal = CDbl(sArray(lR, 1))
        If tmpVal > 0 Then
          If tmpVal < sArray(lR, 3) Then
            Do Until tmpVal * n > sArray(lR, 3)
              tmp = tmpVal * n
              n = n + 0.1
            Loop
            sArray(lR, 2) = tmp
          Else
            sArray(lR, 2) = tmpVal
          End If
        End If
      End If
    Next
    .Value = sArray
  End With
End Sub
Phải IF nhiều là vì phòng các trường hợp sau:
- Bỏ qua các cell rổng
- Giá trị nhập vào mà <=0 thì nhân biết đến khi nào mới... ra
 

File đính kèm

  • hsat.xls
    76 KB · Đọc: 25
Upvote 0
Public Sub qk()
Dim a As Range, b As Range, c As Range, i As Single, K As Integer
For K = 1 To 100
For i = 1 To 10 Step 0.1
Cells(K, 2).Formula = Cells(K, 1).Value * i
K = K + 1
i = i + 0.1
Next K
Next i
If Cells(K, 2).Value < Cells(K, 3).Value Then
Cells(K, 2).Value = Cells(K, 3).Value
Else
Cells(K, 2).Value = Cells(K, 2).Value
End If
End Sub
em sửa code vậy cũng ko chạy được....
bác nào sửa dùm code với....
 
Upvote 0
Chợt nghĩ ra cách khác:
PHP:
Sub Test()
  Dim lR As Long, tmp As Double, tmpVal As Double
  On Error Resume Next
  With Range("A1:C10000")
    sArray = .Value
    For lR = 1 To UBound(sArray, 1)
      If sArray(lR, 1) <> "" Then
        tmpVal = CDbl(sArray(lR, 1))
        If tmpVal > 0 Then
          If tmpVal < sArray(lR, 3) Then
            sArray(lR, 2) = Int(sArray(lR, 3) * 10 / tmpVal) * tmpVal / 10
          Else
            sArray(lR, 2) = tmpVal
          End If
        End If
      End If
    Next
    .Value = sArray
  End With
End Sub
Nếu đúng thì áp dụng, không đúng thì vui lòng mô tả lại vấn đề cho rõ hơn
 
Upvote 0
Public Sub qk()
Dim a As Range, b As Range, c As Range, i As Single, K As Integer
For K = 1 To 100
For i = 1 To 10 Step 0.1
Cells(K, 2).Formula = Cells(K, 1).Value * i
K = K + 1
i = i + 0.1
Next K
Next i
If Cells(K, 2).Value < Cells(K, 3).Value Then
Cells(K, 2).Value = Cells(K, 3).Value
Else
Cells(K, 2).Value = Cells(K, 2).Value
End If
End Sub
em sửa code vậy cũng ko chạy được....
bác nào sửa dùm code với....
Bạn vô lý thiệt, đã góp ý cho bạn ở topic này mà hình như bạn chẳng thèm đọc gì cả: Đừng bao giờ cho câu lệnh thay đổi giá trị biến chạy vào trong vòng For, giá trị này sẽ tự động tăng. Bạn bỏ 2 câu lệnh K=K+1 và i=i+0.1 đi.
Thêm nữa, vòng For i nằm trong vòng For K, do đó Next i phải được đặt trước Next K, hoặc bạn cứ để Next cũng được, VBA sẽ tự biết đây là Next của biến nào.
 
Upvote 0
Em cảm ơn sư phụ Duyệt rất nhiều.....
Chắc trình độ còn thấp quá chưa hiểu hết cái cốt lõi nên chưa lập được..
Anh Duyệt cho em hỏi anh có mớ lớp dạy cho em đang kí học với
thật sự em đang cần học cái này lắm
Cho em xin dthoai hay nick yahoo Anh nhé....
 
Upvote 0
Web KT
Back
Top Bottom