سلام من یه فایل اکسل دارم که میخوام وارد اکسس کنمش و از توی اون یه سری اطلاعات رو فیلتر و استخراج کنم ولی مشکل اصلی اینه
اطلاعاتی که من میخوام روبروی هم نیستند و نمیشه سلکت زد
نمونه شو گذاشتم یه لطفی میکنین نگاه کنین
سلام من یه فایل اکسل دارم که میخوام وارد اکسس کنمش و از توی اون یه سری اطلاعات رو فیلتر و استخراج کنم ولی مشکل اصلی اینه
اطلاعاتی که من میخوام روبروی هم نیستند و نمیشه سلکت زد
نمونه شو گذاشتم یه لطفی میکنین نگاه کنین
آخرین ویرایش به وسیله anoor_h : شنبه 09 اسفند 1399 در 23:46 عصر
بارها مطرح و پاسخ داده شده
https://barnamenevis.org/showthread.php?560186
ممنون دوست عزیز اینجا که شما فرمودین جواب منو نداد من شاید بد پرسیدم یعنی اینکه مشکلی با ایمپورت کردن ندارم اتفاقا اینی که من دارم خیلی بهتر هست ولی نکته اینجاست من میخوام مثلا شماره 03167676767676398541 که جستجو می کنم یا با جدول دیگه جوین میزنم جواب رو صادره : 1399/11/11:استان خراسان رضوي، نقطه مبادله ناحیه یک به من نشون بده نمونه مو گذاشتم
https://s17.picofile.com/file/842664..._exel.rar.html
ممنونم فایل رو فرستادم
پاسخ دقیقا همین بود ولی شما نکته اش رو نگرفتین، نمونه ای که در اون تاپیک بود از کار شما بمراتب پیچیده تر هست.
اینکه میگین با ایمپورت مشکلی ندارین ظاهرا فقط خود عمل ایمپورت رو منظورتون هست و نه نتیجه اش.
به هر حال این شیت که تصویرش در پست 1 گذاشتین ایمپورت میشه ولی نه به شکل درست و اونچه که ایپورت میشه بصورت مستقیم قابل استاده نیست و باید پردازش بشه.
شما در هر صورت برای رفع مشکل طراحی نادرست اولیه مجبور به کدنویسی هستین، حالا یا باید مثل تاپیکی که صحبتش رفت عمل کنین و یا اینکه بعد از ایمپورت این کار رو انجام بدین.
اگر اصرار بر پردازش بعد ایمپورت دارین، اول یک جدول دیگه با طراحی درست بسازین (همه فیلدهای مورد نیاز)
1- جدول ایمپورت شده رو با رکوردست باز کنین.
2- رکوردها رو یکی یکی بخونید (از ظاهر تصویر هر 9 رکورد معادل یک رکورد هست)
3- شرح رو پردازش کنین و با توجه به متن ببینید مربوط به کدوم فیلد هست و مقدارش رو در جدول بنویسین.
4- در فیلدهای ردیف و مرسوله موارد خالی رو رد کنین و هر موقع به مقدار رسیدین، اون رو در جدول اصلی بنویسین.
ممنون از توجهتون ولی این خیلی پیچیده شد نمونه ای چیزی ندارین برام بزارین یا اصل اکسل رو گزاشتم میتونین اصلاح کنین
سلام
سوال اینه که شما اون فایل خروجی اکسل که دارید رو از نرم افزار خاصی میگیرید ؟
همونجا خروجی به روش دیگه داره یا نه ؟
سوال دوم اینکه
به نظر میاد یک نظمی در تعداد ردیفها داره؟
اگر اینجوریه میشه کد داد که رکوردست
هر مثلا ده ردیف یکبار یک کار خاص رو انجام بده .
بله اون نرم افزار خروجی به xml و چیزایه دیگه رو هم داره
همین که چجوری با کد بتونیم ده ردیف ده ردیف بخونیم رو من ندیدم تا حالا
من کد دریافت رو میزارم لطف کنید این کد اون تایپک رو شما تو دلش اصلاح کنید
Dim dlg As FileDialog
Set dlg = Application.FileDialog(msoFileDialogFilePicker)
On Error GoTo exitsub:
DoCmd.RunSQL "DELETE * FROM sheet1", 1
With dlg
.Title = "انتخاب فايل گرفته شده از مبادله"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xls", 1
.Filters.Add "Excel Files", "*.xlsx", 1
.Filters.Add "All Files", "*.*", 2
.InitialFileName = CurrentProject.Path
If .Show = -1 Then
StrFileName = .SelectedItems(1)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "sheet1", StrFileName, True
Else
Exit Sub
End If
End With
Me.Query2subform.Requery
Exit Sub
exitsub:
MsgBox (Err.Description)
نمونه فایل رو در مسیر درایو c کپی کنید(با پوشه)
با رکوردست
کد شماره ردیف رو تونستم به بقیه ردیفها اضاف کنم
ولی برای
شماره مرسوله
کد خاص می خواد ( چون چند ردیف پایین تر قرار داره ) ولی نشد نداره
اگه بشه شماره مرسوله رو توی دو تا فیلد خالی بعد کپی کنیم خیلی خوب میشه
این فایلی که شما گذاشتین فقط شماره ردیف اضافه کرده اونم رکوردهای اول قاطی شده من یه هدف بیشتر ندارم شماره مرسوله رو بزنم مقصد رو برام بیاره همونی که هایلایت کردم
سلام
کلا روش همینه ولی باید کد نویسی بیشتری انجام بشه .
گفتید
بله اون نرم افزار خروجی به xml و چیزایه دیگه رو هم داره
لطفا فایل از نمونه های خروجی که گفتید ( همه نمونه ها ) dbf xml xlsDataOnly بگذارید ببینیم کدام مدل برای ایمپورت به اکسس مناسب تر هست .
سلام مجدد
روش ابداعی مشکل حل شد ولی کلا باید خروجی های دیگه رو هم چک کنیم ببینیم کدام بهتره
برای یک کار بسیار ساده، که راهنمایی کافی و دقیق هم کرده بودم، راه سخت و کدنویسی بیهوده کردین.
این دوست ما که پرسش رو مطرح کرده گویا هیچ آشنایی با کدنویسی نداره، بنابراین یا فقط به راهنمایی بسنده کنین و یا اگر برنامه ای برای ایشون مینویسین کامل و دقیق و ساده باشه تا بتونه راحت استفاده کنه و گیج نشه.
راه درست همون بود که مستقیم از اکسل بخونین. حتی خوندن دیتا ایمپورت شده با رکوردست و ریختن در یک جدول دیگه ، که روشش رو هم نوشته بودم، نیم ساعت هم زمان نوشتن برنامه اش زمان نمیبره.
اینجا از اکسل فقط محیطی برای رسم جدول استفاده شده و همون هم البته بسیار نادرست و ناشیانه انجام شده، اگر از word استفاده میکردن بهتر بود!
من اعتقادی به این که برای این پرسش خاص نمونه بگذارم نداشتم ولی برای رفع ابهام و نشون دادن راه درست این کار رو میکنم.
اول جدول رو طراحی میکنیم؛
فیلدهای f1-f9 در اصل باید اسامی معنادار داشته باشن که بعهده استارتر تاپیک میگذارم.
1.PNG
روش کار در تاپیکی که در پست 2 آمده قبلا بطور کامل معرفی شده، بنابراین توضیح تکراری نمیدم
Dim FileName As StringFileName = "example.xlsx"
Dim ExApp As New Excel.Application
Dim ExWB As Excel.Workbook
Dim ExWS As Excel.Worksheet
Set ExWB = GetObject(CurrentProject.Path & "" & FileName)
Set ExWS = ExWB.Worksheets(1)
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("table1")
Dim i As Integer
i = 1
Do While ExWS.Cells(i, 1) <> ""
Do Until Left(ExWS.Cells(i, 1), 7) = "مبداء :"
i = i + 1
Loop
rs.AddNew
rs!radif = ExWS.Cells(i, 3)
rs!marsooleh = ExWS.Cells(i + 6, 2)
rs!f1 = ExWS.Cells(i, 1)
rs!f2 = ExWS.Cells(i + 1, 1)
rs!f3 = ExWS.Cells(i + 2, 1)
rs!f4 = ExWS.Cells(i + 4, 1)
rs!f5 = ExWS.Cells(i + 5, 1)
rs!f6 = ExWS.Cells(i + 6, 1)
rs!f7 = ExWS.Cells(i + 7, 1)
rs!f8 = ExWS.Cells(i + 8, 1)
rs!f9 = ExWS.Cells(i + 9, 1)
rs.Update
i = i + 10
Loop
rs.Close
Set rs = Nothing
Set ExWS = Nothing
Set ExApp = Nothing
نتیجه کار:
2.PNG
برنامه نمونه:
آخرین ویرایش به وسیله anoor_h : دوشنبه 18 اسفند 1399 در 21:54 عصر
سلام نمیدونم چرا با فایل اصلی این خطا رو میده چیه بنظرتون
تو این خط rs!marsooleh = ExWS.Cells(i + 6, 2)
ضمنا خط بالا رو هم یه توضیح بدین i رو که میدونم ردیف اکسل هست درسته؟
آخرین ویرایش به وسیله anoor_h : سه شنبه 19 اسفند 1399 در 00:16 صبح
سلام
xml هم همون روش اکسل بود .
با این روش مشکلتون حل میشه احتمالا
نمونه جدید
توضیح
اول کل دیتا رو از اکسل به تیبل aaa منتقل میکنیم با این شرط که ردیف ها رو با رکوردست در جلو موارد کپی میکنیم
در مرحله بعد با ایجاد کوئری کدهای مرسوله رو با کد ردیف در یک کوئری میاریم که بشه با dlookup کد مورد نظر رو فراخوان کرد
در نهایت
ابتدا ردیف رو با رکوردست برمیداریم . بعد با Dlookup کد مرسوله رو ذخیره موقت میکنیم و سپس کد مرسوله رو به جدول هر ردیف مثل مرحله اول کپی میکنیم و جدول end رو میسازیم
داداش کارتون بیسته لایک دارین
سلام
در نمونه قبلی اطلاعات مورد نظر به اکسس میاد و بعد روی اون کار میکنیم
و این روشی که مستقیم از اکسل میخونه
در اکسل دو روش داریم برای ادرس دهی
اولی
range("a1")
ودومی
cells(1,1)
این دو یک مفهوم رو دارند
cell(Row,Column)
حالا کد دادیم که مثلا
بعد از اولین ردیفی شامل حروف "مبدا" باشه شماره گذاری کنه و بعد سلولهای بعدی رو بر اساس اون I فراخوان کنه .
i را برابر 1 قرار دهد
i = 1
تا زمانی که به خانه خالی برسد ادامه یابد
Do While ExWS.Cells(i, 1) <> ""
اگر سمت چپ هفتمین ردیف شامل "مبدا" باشد
Do Until Left(ExWS.Cells(i, 1), 7) = "مبداء :"
به i یک شماره اضافه کند
i = i + 1
یعنی مبدا شمارش همون کاراکتر یافت شده هست
اولین مبدا در کدام سلول هست سلول ردیف اول و ستون اول در نظر می گیریم
دومین "مبدا"
مثلا سطر دهم باشد
سطر بعدی و بعدی و .... رو دیتایش در جدول بنشیند و چون marsole در ردیف ششم و سطر دوم قرار دارد .
بعد از هر "مبدا" شش سلول پایین تر و دیتای ستون دوم را می خواند
Loop
به جدول اکسس ردیف اضافه کند
rs.AddNew
و داده ها را از اکسل بر اساس i و شماره ردیف سلول بعد از i فراخوان کند.
rs!radif = ExWS.Cells(i, 3)
rs!marsooleh = ExWS.Cells(i + 6, 2)
rs!f1 = ExWS.Cells(i, 1)
rs!f2 = ExWS.Cells(i + 1, 1)
rs!f3 = ExWS.Cells(i + 2, 1)
الی اخرین مورد هر مرسوله
rs.Update
i = i + 10
Loop
نمونه اکسل به دو روش ادرس دهی cell , range
آخرین ویرایش به وسیله padide55 : چهارشنبه 20 اسفند 1399 در 08:07 صبح
داداش قشنگ توضیح دادی باحوصله
اگه برات زحمتی نیست اینم یه نگاهی بنداز من از روش شما استفاده کردم ولی جابجا رکوردها رو جدا کرده -فقط یه خوبی داره سرعتش معرکه اس
سلام
کدها رو به این صورت جابجا کنید
For l = 0 To textNodes.Length - 1
textN = textNodes(l).NodeValue 'Node name"
If textN >= 1 And textN < 90000 Then
kamza = textN
End If
If textN Like "*ÕÇÏÑå :*" Then
kamba = textN
End If
If Left(textN, 4) = "0311" Then
kamka = textN
rs2.AddNew
rs2![f1] = Nz(kamka)
rs2![f2] = Nz(kamba)
rs2![f3] = Nz(kamza)
rs2.Update
End If
Next
ممنونم خیلی قشنگ شد ازون اکسل هم بهتر شد
یه جای دیگه اش هم گیر کردم زحمتت من یه جدول جدا ایجاد کردم به نام noghte و درونش مقصد ها رو وارد کردم مثل سبزوار و نیشابور و فلان بعد اومدم یه جوین زدم با این جدول استخراج شده مون به این شکل
SELECT noghte.[daftar], Sheet1.f1, Sheet1.f3
FROM Sheet1 INNER JOIN noghte ON Sheet1.f2 Like '*' & noghte.[daftar] & '*';
حالا برام فقط اون مرسولاتی رو میاره که حتما در جدول noghte باشه
حالا سوال من اینجاست چطوزی یه کوئری جدید بنویسیم که بهش بگم فقط مرسولاتی رو بیار که شهرهای جدول نقطه نباشه
این جواب نمیده
SELECT noghte.[daftar], Sheet1.f1, Sheet1.f3
FROM Sheet1 INNER JOIN noghte ON Sheet1.f2 not Like '*' & noghte.[daftar] & '*';
سلام در ویزارد کوئری از unmatch کوئری استفاده کنید . راحته.
نمونه
ابتدا در کوئری جستجومیکنیم و کلمه شهر چندمین حرف در متن هست .
instr(stepfrom;text;findwhat)
step از چندمین کاراکتر شروع به شمارش کند
text متن مورد جستجو
findwhat کلمه مورد جستجو
بعد جستجو میکنیم که بعد از شماره بدست امده از کلمه شهر
کاما ، چندمین کاراکتر در متن هست
چون چندین کاما در متن هست .
بعد با mid بعد از کلمه شهر تا تعداد حروف رسیده به کاما میشه نام شهر یعنی بین کلمه شهر و کامای بعد از ان
نمونه
حالا بدون استفاده از like میشه جستجو انجام داد
آخرین ویرایش به وسیله padide55 : یک شنبه 24 اسفند 1399 در 08:11 صبح