Sub daodapan(ByRef s2 As String, ByVal bda4 As Boolean)
Dim arr
Dim brr
Dim n As Integer, i As Integer
Dim stemp1 As String, stemp2 As String, phuongan As String
Dim s As String
Const THAYTHEPHANTRAM As String = "@~"
Const KYTUGAYNHIEU As String = "\%"
On Error GoTo thoat
s = s2
s = Replace(s, KYTUGAYNHIEU, THAYTHEPHANTRAM, , , vbTextCompare)
arr = tachlayloigiai(s, bda4)
If IsArray(arr) = False Then Exit Sub
n = UBound(arr, 2)
If arr(3, n) = Empty Then Exit Sub '11/7/2021: Phong tranh dao dap an linh tinh
ReDim brr(1 To n)
Call napgiatrimangngaunhien(brr)
'Dao dap an
For i = n To 1 Step -1
stemp1 = Left(s, arr(2, i) - 1)
stemp2 = Right(s, Len(s) - arr(3, i))
phuongan = arr(1, brr(i))
s = stemp1 & phuongan & stemp2
Next i
s2 = s
s2 = Replace(s, THAYTHEPHANTRAM, KYTUGAYNHIEU, , , vbTextCompare)
thoat:
End Sub
Dữ liệu đọc luôn trên excel đó . Xử lý đầu vào trên excel luôn nha.@tuhocvba trong file bạn gửi chỉ thấy có file excel, không có dữ liệu mẫu nên không test được và mình cũng chưa rõ các "trường hợp" ở đây là gì? Theo mình, vì file đầu vào có cấu trúc không chuẩn (ví dụ có dòng trống, khoảng trắng ở đầu...) nên thiết kế 1 thủ tục để chuẩn hóa dữ liệu trước khi làm các bước tiếp theo.
@tuhocvba Function xacdinhdaungoac bị xóa rồi nên mình chưa test được.
Function xacdinhdaungoac(ByVal s As String, vitri As Integer, sokytu As Integer) As String
If s = "" Or vitri = 0 Then
xacdinhdaungoac = ""
Exit Function
End If
xacdinhdaungoac = Mid(s, vitri, sokytu)
End Function
Cố lên. @Euler nó bảo chỉ cần 1h là nó code được.OK, để mình thử xem.
Function Tach(ByVal s As String, Optional ByVal slda As Integer = 4)
Const Key As String = "\choice"
Const cm As String = "%"
Const c1 As String = "{"
Const c2 As String = "}"
Const dhkt As String = "\"
Const loigiai As String = "\loigiai"
Dim da, CountAns&, s1$
Dim StartSearchingPos&, k&, n&, i&, j&, PrevI&
Static RegExp As Object
StartSearchingPos = InStr(s, Key) + Len(Key)
s1 = Mid(s, StartSearchingPos, Len(s) - StartSearchingPos - InStr(s, loigiai))
If RegExp Is Nothing Then
Set RegExp = CreateObject("VBScript.RegExp")
End If
With RegExp
.Global = True
.Pattern = "[^{}]"
s1 = .Replace(s1, "")
End With
n = Len(s1)
i = 1
PrevI = 1
CountAns = 0
da = s
Do While CountAns <= slda And i <= n
If Mid(s1, i, 1) = c2 Then Exit Do
k = 1
i = i + 1
Do While k > 0 And i <= n
If Mid(s1, i, 1) = c2 Then
k = k - 1
Else
k = k + 1
End If
i = i + 1
Loop
If k > 0 Then Exit Do
CountAns = CountAns + 1
If CountAns = 1 Then
ReDim da(1 To 3, 1 To CountAns)
Else
ReDim Preserve da(1 To 3, 1 To CountAns)
End If
da(2, CountAns) = InStr(StartSearchingPos, s, c1)
For j = 1 To (i - PrevI) / 2
StartSearchingPos = InStr(StartSearchingPos, s, c2) + 1
Next
da(3, CountAns) = StartSearchingPos - 1
da(1, CountAns) = Mid(s, da(2, CountAns), StartSearchingPos - da(2, CountAns))
PrevI = i
Loop
Tach = da
End Function
Vật thể nào trong các vật thể sau không phải là
khối đa diện?
\choice
{x^{21}+{u_1}^2}
{x^{21}+{u_2}^2}
{x^{22}+{u_3}^2}
{\True x^{23}+{u_3}^2}
\loigiai{
}
Function Tach(ByVal s As String, Optional ByVal slda As Integer = 4)
Const Key As String = "\choice"
Const cm As String = "%"
Const c1 As String = "{"
Const c2 As String = "}"
Const dhkt As String = "\"
Const loigiai As String = "\loigiai"
Dim da, CountAns&, s1$
Dim StartSearchingPos&, k&, n&, i&, j&, PrevI&
Static RegExp As Object
StartSearchingPos = InStr(s, Key) + Len(Key)
's1 = Mid(s, StartSearchingPos, Len(s) - StartSearchingPos - InStr(s, loigiai))
If InStr(s, loigiai) > 0 Then
n = InStr(s, loigiai) - 1
Else
n = Len(s)
End If
s1 = Mid(s, StartSearchingPos, n - StartSearchingPos + 1)
If RegExp Is Nothing Then
Set RegExp = CreateObject("VBScript.RegExp")
End If
With RegExp
.Global = True
.Pattern = "[^{}]"
s1 = .Replace(s1, "")
End With
n = Len(s1)
i = 1
PrevI = 1
CountAns = 0
da = s
Do While CountAns <= slda And i <= n
If Mid(s1, i, 1) = c2 Then Exit Do
k = 1
i = i + 1
Do While k > 0 And i <= n
If Mid(s1, i, 1) = c2 Then
k = k - 1
Else
k = k + 1
End If
i = i + 1
Loop
If k > 0 Then Exit Do
CountAns = CountAns + 1
If CountAns = 1 Then
ReDim da(1 To 3, 1 To CountAns)
Else
ReDim Preserve da(1 To 3, 1 To CountAns)
End If
da(2, CountAns) = InStr(StartSearchingPos, s, c1)
For j = 1 To (i - PrevI) / 2
StartSearchingPos = InStr(StartSearchingPos, s, c2) + 1
Next
da(3, CountAns) = StartSearchingPos - 1
da(1, CountAns) = Mid(s, da(2, CountAns), StartSearchingPos - da(2, CountAns))
PrevI = i
Loop
Tach = da
End Function
If k > 0 Then Exit Do
If CountAns = slda Then Exit Do
CountAns = CountAns + 1
\begin{ex}
\immini
{
vanban
\choice {dap an1} {dap an2} {dap an3}{dap an 4}
{
hinh ve
}
\end{ex}