PDA

View Full Version : سوال: اطلاعات داخل فیلد



mrn181
پنج شنبه 30 آبان 1398, 15:19 عصر
با سلام
من داخل یه فیلد اطلاعاتم به این صورت هستش :

مثلاً 1~3-5-7-8-9~15-20

حالا چطور می تونم تمام اعداد داخل این فیلد رو خارج کنم.

که اینجوری بشه : 1,2,3,5,7,8,9,10,11,12,13,14,15,20

ASHKANLAEI
پنج شنبه 30 آبان 1398, 15:28 عصر
' regex:
"\d+"

mrn181
پنج شنبه 30 آبان 1398, 15:33 عصر
متوجه نشدم
یکم بیشتر توضیح میدید.

ASHKANLAEI
پنج شنبه 30 آبان 1398, 16:10 عصر
من با اکسس کار نکردم نمیدونم راهی برای کار با ریجکس داره یا نه ولی اگه داشته باشه از "+d\" میتونید استفاده کنید برای پیدا کردن اعداد توی یک رشته.

mazoolagh
پنج شنبه 30 آبان 1398, 18:22 عصر
بهترین راهنمایی همین استفاده از RegExp بود!

اول باید رفرنس موردنیاز رو به برنامه اضافه کنین:
150988

mazoolagh
پنج شنبه 30 آبان 1398, 18:23 عصر
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

mazoolagh
پنج شنبه 30 آبان 1398, 18:24 عصر
روش استفاده :

150989

mazoolagh
پنج شنبه 30 آبان 1398, 18:25 عصر
برنامه نمونه :

mazoolagh
پنج شنبه 30 آبان 1398, 18:30 عصر
با سلام
من داخل یه فیلد اطلاعاتم به این صورت هستش :

مثلاً 1~3-5-7-8-9~15-20

حالا چطور می تونم تمام اعداد داخل این فیلد رو خارج کنم.

که اینجوری بشه : 1,2,3,5,7,8,9,10,11,12,13,14,15,20

البته الان که دقت میکنم شما با ~ اومدین range تعریف کردین
اینجوری یک کم سخت تر میشه ولی راه باز هم همین regexp است.

mrn181
جمعه 01 آذر 1398, 13:03 عصر
دستتون درد نکنه.

mrn181
جمعه 01 آذر 1398, 13:09 عصر
البته الان که دقت میکنم شما با ~ اومدین range تعریف کردین
اینجوری یک کم سخت تر میشه ولی راه باز هم همین regexp است.

دستتون درد نکنه.
فقط بیزحمت می شه بگید برای اینکه
اینجوری بشه : 1,2,3,5,7,8,9,10,11,12,13,14,15,20 چیکار باید کرد.
اگه راهنمایی کنید ممنون می شم

mazoolagh
جمعه 01 آذر 1398, 18:37 عصر
1- هنوز برای من مشخص نیست که خروجی قراره چی باشه؛ من فقط یک حلقه گذاشتم که اعداد رو چاپ میکنه.
شما میتونین خروجی تابع رو یک array یا collection یا dictionary یا جدول یا ... بگذارین.

2- برای اینکه ترتیب خروجی دقیقا همین ترتیب لیست باشه برای range ها از collection استفاده میکنیم که نیاز به یک رفرنس داره.
کار با کالکشن به مراتب راحتتر از کار با dynamic array ها هست.
اگر ترتیب لیست مهم نیست به کالکشن هم نیازی نیست.

150996

mazoolagh
جمعه 01 آذر 1398, 18:39 عصر
روش کار به این صورت هست که اول برای range ها scan میکنیم،
بعد هر range رو با سری اعدادش جایگزین میکنیم
نهایتا مثل تابع قبلی همه اعداد رشته جدید رو استخراج میکنیم

mazoolagh
جمعه 01 آذر 1398, 18:42 عصر
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

mazoolagh
جمعه 01 آذر 1398, 18:52 عصر
روش استفاده:

150998

mazoolagh
جمعه 01 آذر 1398, 19:00 عصر
برنامه نمونه

mrn181
جمعه 01 آذر 1398, 22:13 عصر
برنامه نمونه
خیلی خیلی ممنونم از کمکتون.