Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhờ giải thích code

Có ai giải thích hộ mình đoạn code này:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + _
465 * (ProductionMonth - 1)).Resize(20, 8).Value
code này mình lấy trong đoạn copy dữ liệu từ sheet này sang sheet khác nhưng chưa hiểu chổ này. Thanks mọi người!
 
Lần chỉnh sửa cuối:
Upvote 0
Có ai giải thích hộ mình đoạn code này:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + _
465 * (ProductionMonth - 1)).Resize(20, 8).Value
code này mình lấy trong đoạn copy dữ liệu từ sheet này sang sheet khác nhưng chưa hiểu chổ này. Thanks mọi người!
Bạn gửi 1 đoạn thôi làm sao biết các lệnh, hàm, biến, ... trong đó là gì?
 
Upvote 0
Có ai giải thích hộ mình đoạn code này:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + _
465 * (ProductionMonth - 1)).Resize(20, 8).Value
code này mình lấy trong đoạn copy dữ liệu từ sheet này sang sheet khác nhưng chưa hiểu chổ này. Thanks mọi người!

Mã:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + [COLOR=#ff0000][B]_
[/B][/COLOR]465 * (ProductionMonth - 1)).Resize(20, 8).Value

Dấu gạch nối màu đỏ (_) là cách mà chúng ta dùng để xuống hàng một câu lệnh trong code.

Nếu không xuống hàng thì nó sẽ như thế này:

Mã:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + 465 * (ProductionMonth - 1)).Resize(20, 8).Value

Nếu như sau khi tính toán, kết quả của:

Mã:
Sheet2.Cells(9 + 20 * (ProductionDay - 1) + 465 * (ProductionMonth - 1)).Resize(20, 8).Value

là một giá trị X nào đó, thì toàn bộ câu lệnh trên sẽ như sau:

Mã:
Range("A8:H27").Value = [B][COLOR=#ff0000]X[/COLOR][/B]

Như vậy, toàn bộ vùng A8 đến H27 (A8:H27) đều nhận giá trị là X.
 
Upvote 0
Ở Sheet 2 có một bảng dữ liệu (có lẽ liên quan đến Production). Dùng con toán
9 + 20 * (ProductionDay - 1) +
465 * (ProductionMonth - 1)
sẽ tính ra được vị trí của một cột (có lẽ liên quan đến ProductionDay và ProductionMonth)
Tại dòng 1, cột vừa tính ra, lấy một mảng 20 dòng và 8 cột
Copy dữ liệu 160 ô này vào mảng A8:H27 của sheet hiện tại (có lẽ là sheet 1)

Bạn hỏi 1 câu mà muốn trả lời phải dùng tất cả 3 "có lẽ". Điều này chứng tỏ bạn cần học cách diễn đạt vấn đề hơn là học cách code.

 
Upvote 0
Có ai giải thích hộ mình đoạn code này:
Range("A8:H27").Value = Sheet2.Cells(9 + 20 * (ProductionDay - 1) + _
465 * (ProductionMonth - 1)).Resize(20, 8).Value
code này mình lấy trong đoạn copy dữ liệu từ sheet này sang sheet khác nhưng chưa hiểu chổ này. Thanks mọi người!
Hình như đoạn code này để gán dữ liệu, trong đó:
Sheet2.Cells(9 + 20 * (ProductionDay - 1) + _
465 * (ProductionMonth - 1))
Xác định cell đầu tiên của vùng dữ liệu nguồn ở sheet 2
Mở rộng vùng dữ liệu nguồn ra thành vùng có 20 hàng và 8 cột
Gán value của vùng dữ liệu nguồn này sang vùng nhận dữ liệu là vùng [A8:H27] ( chắc của sheet hiện hành)
 
Upvote 0
Thanks sự giúp đỡ của mọi người! Chả là mình đang thiết kế cái form nhập số liệu cho công việc, không rành VBA nhưng cũng mày mò đôi chút. Ban đầu cũng định hình được cái form như file đính kèm nhưng nó bị lỗi ở chỗ mỗi khi mình nhập dữ liệu vào sheet inputdata rồi enter nó lại nhảy sang sheet data, và hình như 2 sheet này chưa liên kết được với nhau. Mọi người chỉ ra cái lỗi giúp mình với! -+*/-+*/
 

File đính kèm

  • dknnmq_Nhap lieu coffee.rar
    77.7 KB · Đọc: 15
Upvote 0
Bạn nên n6u rõ hơn đề cương của bạn là gì đi dùm 1 cái!

. . ., (2) nhưng nó bị lỗi ở chỗ mỗi khi mình nhập dữ liệu vào sheet inputdata rồi enter nó lại nhảy sang sheet data, (3) và hình như 2 sheet này chưa liên kết được với nhau.
(1) Mọi người chỉ ra cái lỗi giúp mình với!

(1) Nhìn thấy 1 rừng code luôn, nhưng không biết bắt đầu dò từ đâu để giúp bạn!

(2) Nên cụ thể là bạn muốn nhập vô vùng nào của trang này;
{ENTER} là {ENTER} ở ô cuối cùng nào khi nhập (sự kiện tại 1 ô nhất định) hay bấm vô nút chứa macro nào?

(3) Mình rờ vô các nút thì chúng im thinh thít;
Mà sao module 1 trống hơ, lại để các hàm của bạn ở module 2 làm chi vậy?
 
Upvote 0
Chào các thầy các anh, cho em hỏi em gặp vài cái code, ví dụ như mẩu dưới đây:
PHP:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 9 Then
   If ActiveSheet.ListBox1.ListCount = 0 Then
      Hide
      ActiveCell.Activate
   Else
      ActiveSheet.ListBox1.Activate
      ActiveSheet.ListBox1.ListIndex = 0
   End If
ElseIf KeyCode = 37 Then
   Hide
   ActiveCell.Offset(, -1).Activate
ElseIf KeyCode = 38 Then
   Hide
   ActiveCell.Offset(-1).Activate
ElseIf KeyCode = 39 Then
   Hide
   ActiveCell.Offset(, 1).Activate
ElseIf KeyCode = 40 Then
   If ActiveSheet.ListBox1.ListCount = 0 Then
      Hide
      ActiveCell.Offset(1).Activate
   Else
      ActiveSheet.ListBox1.Activate
      ActiveSheet.ListBox1.ListIndex = 0
   End If
ElseIf KeyCode = 46 Then
   Hide
   ActiveCell.ClearContents
   ActiveCell.Activate
End If
End Sub


Vậy những cái tên và con số: KeyCode = 9, KeyCode = 37, KeyCode = 38, KeyCode = 39, KeyCode = 40, KeyCode = 46 có nghĩa là gì ? có công dụng gì ?

Và ví dụ này:
PHP:
Private Sub cboTenHang_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else


Case 9, 13, 37 To 40 : nghĩa là sao? công dụng như thế nào ?
 
Upvote 0
Vậy những cái tên và con số: KeyCode = 9, KeyCode = 37, KeyCode = 38, KeyCode = 39, KeyCode = 40, KeyCode = 46 có nghĩa là gì ? có công dụng gì ?

Case 9, 13, 37 To 40 : nghĩa là sao? công dụng như thế nào ?
Với một Controls (TextBox, ComboBox v.v...) có các sự kiện là KeyUp, KeyDown, đối số của nó là một biến mang mã số của một key (phím). Các keycode đó là mã số của các phím Tab, Enter, và 4 phím mũi tên.
 
Upvote 0
bác nào cho em hoỉ có code nào thay thế cho function CONCATENATE không nhỉ?
 
Upvote 0
bác nào cho em hoỉ có code nào thay thế cho function CONCATENATE không nhỉ?
Đây là một hàm nối chuỗi trong Excel:

=CONCATENATE(A1,B1)

Nó tương đương với:

=A1 & B1

Nhưng trong VBA, hàm này lại không được hỗ trợ bởi WorksheetFunction, vì thế ta chỉ việc nối chúng lại bằng & mà thôi.

ChuoiNoi = "Hoàng " & "Trọng " & "Nghĩa"

Nhưng nếu bạn muốn làm một hàm tự tạo thì như vầy:

Mã:
Function vbaCONCATENATE(ParamArray VarArg()) As String
    vbaCONCATENATE = Join(VarArg, "")
End Function

Cấu trúc như hàm CONCATENATE.
 
Upvote 0
Em tạo thủ tục định dạng có điều kiện (CF) bằng công thức cho workbook, nhưng khác với công thức khi được gán trong cell là
trong vba mặc định dấu "," còn trong VBA khi dùng CF nó không tự động chuyển đổi dấu nên đoạn code của em chỉ chạy được nếu máy đó chỉnh list seperator là ; mới chạy được. Các anh giúp em giải quyết vấn đề làm thế nào để code có thể hoạt động ở bất kỳ máy nào được không ạ.

Mã:
Sub conditionalformatting()
'
' Macro2 Macro
'
        
    'set dieu kien cot L khong co CSDL
    Rows("2:1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=$L2=""khong co CSDL"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = 0
        .ThemeColor = xlThemeColorAccent6
        .TintAndShade = 0.399945066682943
        .PatternTintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    
    'set dieu kien cot L can check du lieu
    Rows("2:1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=or($L2=""CHECK"";and($L2=""khong co CSDL"";iferror(search("" ? "";$J2);0)>0))"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    
        'set dieu kien cot E (Kiem tra TK)
    Rows("2:1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=AND(len($e2)>0;or(len($e2)<>12;left($e2;4)<>""711A"";iferror(value(right($e2;len($e2)-5));0)=0))"
        
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    
    'set dieu kien cot G (tien to)
    Range("G2:G1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=AND($G2<>""711A"";$G2<>"""")"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    
    'set dieu kien cot F (so ky tu TK)
    Range("F2:F1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=AND($F2<>12;$F2<>0)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    

    
    'set dieu kien cot I
    Range("I2:I1500").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=OR(AND(LEN($I2)<>7;LEN($I2)<>0);AND(LEN($I2)=7;IFERROR(VALUE($I2);0)=0))"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Range("A2").Select
End Sub
 
Upvote 0
Em tạo thủ tục định dạng có điều kiện (CF) bằng công thức cho workbook, nhưng khác với công thức khi được gán trong cell là
trong vba mặc định dấu "," còn trong VBA khi dùng CF nó không tự động chuyển đổi dấu nên đoạn code của em chỉ chạy được nếu máy đó chỉnh list seperator là ; mới chạy được. Các anh giúp em giải quyết vấn đề làm thế nào để code có thể hoạt động ở bất kỳ máy nào được không ạ.
Hàm Listseparator() sau đây sẽ trả kết quả là dấu phân cách. Bạn thay dấu ";" trong code thành hàm này.
Mã:
Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Function listseparator() As String
Dim s As String
Dim n As Long
s = String(250, " ")
n = GetProfileString("Intl", "sList", "", s, 250)
listseparator = Left(s, 1)
End Function
 
Upvote 0
Hàm Listseparator() sau đây sẽ trả kết quả là dấu phân cách. Bạn thay dấu ";" trong code thành hàm này.
Mã:
Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Function listseparator() As String
Dim s As String
Dim n As Long
s = String(250, " ")
n = GetProfileString("Intl", "sList", "", s, 250)
listseparator = Left(s, 1)
End Function

em đã làm được rồi, cám ơn anh rất nhiều )(&&@@
 
Upvote 0
Chao cac anh GPE
Hiện tại em thấy code trên diễn đàn của anh quanghai như sau
Mã:
[COLOR=#0000BB][FONT=monospace]Sub copydulieu[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim wb [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Workbook[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sh [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheet[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]WBname [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]String
Dim cursh [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheet[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]chk [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Boolean
Set cursh [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]ActiveSheet
WBname [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"KH.xls"
[/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Each wb In Workbooks
   [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wb[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Name [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]WBname Then chk [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]True
Next
[/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]chk [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]False Then Workbooks[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Open [/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]ThisWorkbook[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Path [/FONT][/COLOR][COLOR=#007700][FONT=monospace]& [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"\" & WBname)
With Workbooks(WBname)
   For Each sh In .Worksheets
      sh.Range(sh.[C10], sh.[E65536].End(3)).Copy cursh.[B65536].End(3)(2)
      sh.Range(sh.[J10], sh.[L65536].End(3)).Copy cursh.[B65536].End(3)(2)
   Next
End With
cursh.Range("[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]B5[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]", cursh.[B65536].End(3)).Offset(, -1) = [row(a:a)]
End Sub  [/FONT][/COLOR]
Hiện tại file này em muốn sữa chỉ copy 3 sheet trong KH thôi còn sheet 4 không copy
Chẳng hạn em muộn copy trên lấy file khác sửa tên thành kế hoạch và sua cột C10 & E thành cột khác
nó cũng chạy nhung copy từ C10 cho đến chữ tổng luôn chứ không giống code anh quanghai


 
Upvote 0
Kính gửi các anh chị. Em được giao nhiệm vụ quản lý đồ ăn nhẹ đặt tại các phòng trong một khách sạn. Những đồ này có thể bán, miễn phí (Comp) hoặc thất thoát do không tính tiền được với khách (Lost). Em đã tạo một file và để dữ liệu hàng ngày tại sheet “data”. Yêu cầu là phải kiểm soát được:
1.Lượng bán, doanh thu theo từng phòng, theo ngày, tháng cho từng loại mặt hàng ( đối với cả ba loại hình trên)
- với yêu cầu này em đã làm được trong sheet Daily và Monthly (cám ơn những đoạn code học được từ bác NDU và bác Pikachu) nhưng nếu muốn vừa có liệt kê chi tiết vừa có tổng tiền bên dưới của từng phòng , rồi từng ngày giống như dạng groupby trong access thì chưa làm được
2.Thống kê được lượng hàng đang có đặt trong phòng theo từng loại (sheet setup)
3.Kiểm soát ngày hết hạn của từng loại trong sheet ExDate (có nhiều hạn sử dụng khác nhau cho mỗi loại sản phẩm)
Hiện tại mỗi khi bù lại sản phẩm bán hoặc bị mất vào phòng em phải điền tay vào hai sheet trên. Do đó em làm sheet update để nhập cho nhanh nhưng vì mới tự mày mò VBA nên viết code dài dòng và lủng củng quá. Nhờ các anh chị chỉ dùm cách viết khác gọn hơn.
Nhân tiện xin cho em hỏi nếu từ những sheet đó có thể viết code để lọc ra một báo cáo tổng hợp về hạn sử dụng được không ạ ví dụ như:
Sản phẩm A có hạn X số lượng 100
Sản phẩm A có hạn Y số lượng 1100
Sản phẩm B có hạn Z số lượng 1600
Sản phẩm B có hạn X số lượng 1500
Và nếu có cách nào tổ chức dữ liệu tốt hơn xin các anh chị chỉ dù. Em xin cảm ơn
 

File đính kèm

  • Quan ly do an nhe.xlsm
    337 KB · Đọc: 5
Upvote 0
Các pro giải thích giúp em code

Dear Các Pro
em chưa hiểu đoạn code này, mong các pro giải thích giúp em, em mới tập tành học về code
Thanks

adors.Open cmdtxt, Db, 3, 3
 
Upvote 0
Option Explicit


Public Sub LOC_U18()
Dim sArr(), dArr(), I As Long, K As Long
With Sheets("DSCNV chuan ")
sArr = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 41).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 7)
For I = 1 To UBound(sArr, 1)
If sArr(I, 1) = "g" Then
If sArr(I, 41) < 18 Then
K = K + 1: dArr(K, 1) = K: dArr(K, 7) = sArr(I, 41)
dArr(K, 2) = sArr(I, 5): dArr(K, 3) = sArr(I, 7)
dArr(K, 4) = sArr(I, 9): dArr(K, 5) = sArr(I, 19)
dArr(K, 6) = "=Datedif(RC[-2],RC[-1],""Y"")"
End If
End If
Next I
Sheets("DS_U18").[A4:G4].Resize(K) = dArr
Sheets("DS_U18").[F4].Resize(K).Value = Sheets("DS_U18").[F4].Resize(K).Value
End Sub
em có đoẠN COBENAYF MONG CÁC BÁC GIẢI THÍCH GIÚP Ạ
 
Upvote 0
Code mở file

Kính nhờ các anh chị test xem giúp vì đâu Code file excel để mở file sao máy không báo lỗi nhưng cũng không được như ý.
 

File đính kèm

  • Test.rar
    864.3 KB · Đọc: 54
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom