با سلام
من داخل یه فیلد اطلاعاتم به این صورت هستش :
مثلاً 1~3-5-7-8-9~15-20
حالا چطور می تونم تمام اعداد داخل این فیلد رو خارج کنم.
که اینجوری بشه : 1,2,3,5,7,8,9,10,11,12,13,14,15,20
با سلام
من داخل یه فیلد اطلاعاتم به این صورت هستش :
مثلاً 1~3-5-7-8-9~15-20
حالا چطور می تونم تمام اعداد داخل این فیلد رو خارج کنم.
که اینجوری بشه : 1,2,3,5,7,8,9,10,11,12,13,14,15,20
متوجه نشدم
یکم بیشتر توضیح میدید.
من با اکسس کار نکردم نمیدونم راهی برای کار با ریجکس داره یا نه ولی اگه داشته باشه از "+d\" میتونید استفاده کنید برای پیدا کردن اعداد توی یک رشته.
آخرین ویرایش به وسیله ASHKANLAEI : پنج شنبه 30 آبان 1398 در 16:39 عصر
بهترین راهنمایی همین استفاده از RegExp بود!
اول باید رفرنس موردنیاز رو به برنامه اضافه کنین:
1.PNG
Option Compare Database
Option Explicit
Public Function ExtractNumbers(x As Variant) As Variant
Dim RE As New RegExp
RE.Global = True
RE.Pattern = "\d+"
Dim Numbers
Set Numbers = RE.Execute(x)
Dim i As Integer
For i = 1 To Numbers.Count
Debug.Print Numbers(i - 1)
Next
End Function
روش استفاده :
2.PNG
دستتون درد نکنه.
1- هنوز برای من مشخص نیست که خروجی قراره چی باشه؛ من فقط یک حلقه گذاشتم که اعداد رو چاپ میکنه.
شما میتونین خروجی تابع رو یک array یا collection یا dictionary یا جدول یا ... بگذارین.
2- برای اینکه ترتیب خروجی دقیقا همین ترتیب لیست باشه برای range ها از collection استفاده میکنیم که نیاز به یک رفرنس داره.
کار با کالکشن به مراتب راحتتر از کار با dynamic array ها هست.
اگر ترتیب لیست مهم نیست به کالکشن هم نیازی نیست.
3.PNG
روش کار به این صورت هست که اول برای range ها scan میکنیم،
بعد هر range رو با سری اعدادش جایگزین میکنیم
نهایتا مثل تابع قبلی همه اعداد رشته جدید رو استخراج میکنیم
Option Compare Database
Option Explicit
Public Function ExtractNumbers(x As Variant) As Variant
Dim RE As New RegExp
Dim Numbers
Dim Ranges
Dim Range
Dim i, j, k As Integer
RE.Global = True
RE.Pattern = "\d+~\d+"
Set Ranges = RE.Execute(x)
For i = 1 To Ranges.Count
RE.Pattern = "\d+"
Set Range = RE.Execute(Ranges(i - 1))
Dim D As New Dictionary
For j = Range(0) To Range(1)
D.Add j, D.Count
Next j
x = Replace(x, Ranges(i - 1), Join(D.Keys, ","))
Set D = Nothing
Next i
Set Numbers = RE.Execute(x)
For i = 1 To Numbers.Count
Debug.Print Numbers(i - 1)
Next
End Function
روش استفاده:
4.PNG