نویسنده موضوع: مشکل اجرای ماکرو در هر بار گزارش گیری از سایت  (دفعات بازدید: 48 بار)

mahdi3924

  • کاربر تازه‌وارد
  • *
  • ارسال: 2
  • جمع امتیازها: +0/-0
سلام و عرض ادب
ی سوال درباره عدم اجرای ماکرو دارم، ممنون می شم جوابم رو بدین.
من مجبورم همیشه از یک سایت گزارش خروجی بگیرم (خروجی اکسل) که تو این گزارش سطر و ستون هاش همیشه یک جوره و فقط تعداد سطرهاش فرق می کنه. روش کارم اینه: ضبط ماکرو رو شروع می کنم، در شیت جاری گزارش رو تبدیل به جدول می کنم و بعد فیلتر سطر اول رو فعال می کنم و بعد محتویات فیلتر شده رو انتخاب و کپی مکنم  و بعد در یک ورک بوک جدید Paste می کنم و بعد ورک بوک جدید رو ذخیره می کنم و بعد ضبط ماکرو رو استپ می کنم. محتویات گزارش زبان فارسی هست. (ماکرو رو در Personal Macro WorkBook ضبط می کنم) . جواب هم می گیرم. اما بار بعد که از همون سایت خروجی اکسل می گیرم و فایل ماکرو ذخیره شده رو اجرا می کنم، ماکرو اجرا نمی شه و تو خط:
ActiveSheet.ListObjects(“Table27″).TableStyle = “TableStyleLight13″
گیر می کنه.
ممنون می شم اگه کمکم کنین

lamp

دانلود فهرست + فصل اول کتاب توابع و فرمول نویسی اکسل

خبر: کامل ترین کتاب توابع و فرمول نویسی در اکسل ترجمه تیم فرساران


majid_mx4

  • مدیران انجمن
  • *
  • ارسال: 1751
  • جمع امتیازها: +630/-7
با سلام

دوست عزیز احتمالا این بخاطر اینه که شما هر بار جدول جدیدی میگیرید نام این جدول تغییر میکنه مثلا table27 میشود table30 و یا ....

برای رفع خطا باید نام جدول جدید را بدست بیارید و در ماکرو خود از آن استفاده کنید .

برای بدست آوردن نام جدول از دستور زیر استفاده
Tname = ActiveSheet.ListObjects(1).Name
حال میتوانید Tname را معادل دستور خود قرار دهید.

مثلا
ActiveSheet.ListObjects(Tname).TableStyle = “TableStyleLight13″

توجه داشته باشید از انجایی که دستورات کامل شما را ندارم کلیت کار گفته شده  .

ویا نام جدول خود را تغییر دهید که در این مورد هم میتوانید از دستور زیر استفاده نمایید.

Sub RenameTable()

bb = ActiveSheet.ListObjects(1).Name

Dim oldTbl As String, newTbl As String
oldTbl = bb 'change to suit
newTbl = "myTableName" 'change to suit
With ActiveSheet
    .ListObjects(oldTbl).Name = newTbl
End With
End Sub
موفق باشید میر

mahdi3924

  • کاربر تازه‌وارد
  • *
  • ارسال: 2
  • جمع امتیازها: +0/-0
با سلام

دوست عزیز احتمالا این بخاطر اینه که شما هر بار جدول جدیدی میگیرید نام این جدول تغییر میکنه مثلا table27 میشود table30 و یا ....


سلام
بسیار بسیار سپاسگزارم از پاسخ گویی شما دوست عزیز؛ از این که وقت گذاشتین واقعا ممنونم.
دقیقا مشکل از Table بود، کاملا درست اشاره کردین. اما چند سوال دیگه برام مطرح شد و ممنون می شم اگه جواب بدین.
1. چرا هر دفعه عدد Table یکی بالا می ره؟ من تو اینترنت زیاد سرچ کردم اما جوابی نیافتم.

2. در مورد ListObject() هم چیز زیادی پیدا نکردم. من با C تو الکترونیک برنامه زیاد نوشتم، اما VBA نه. واسه همین با جزئیات این دستورات مشکل دارم. هر چند هم که کتاب برنامه نوسی ماکرو رو خریدم، اما زیاد جالب در نیامد و در مورد جدول ها و نکته های برنامه نویسی زیاد اشاره نکرده.
واسه همین معنی عدد 1 داخل پرانتز جلوی ListObject رو نفمهیدم.

3. آیا برنامه تغییر نام جدول که لطف کردین و گذاشتین رو باید ابتدای برنامه و قبل از شروع برنامه اصلی بزارم یا نه؟

4. لیست خروجی که من از سایت می گیرم زبان فارسیه. وقتی ضبط ماکرو می کنم و لیستم رو مثلا با نام ایران زمین فیلتر می کنم، می بینم تو برنامه ماکرو "ایران زمین" نوشته و اجرای ماکرو دفعه بعد مشکل پیدا میکنه. بعد از کلی دردسر وقتی سلول ایران زمین تو گزارشم رو کپی کردم و تو برنامه ماکرو Past کردم دیدم می نویسه: "ا?ران زم?ن"  و وقتی به همین صورت گذاشتم برنامه کار کرد!!!

برنامه کامل که با ضبط ماکرو و کمک شما نوشتم به شرح زیره:

Sub xx()
'
' xx Macro
'

'
    sname = ActiveSheet.ListObjects(1).Name
    ActiveSheet.ListObjects(sname).TableStyle = "TableStyleLight13"
   
    Range("A1").Select
    ActiveSheet.ListObjects(sname).TableStyle = "TableStyleLight17"
    ActiveSheet.ListObjects(sname).Range.AutoFilter Field:=7, Criteria1:= _
        "ملت"
    Range(sname).Select
    Range(sname).Activate
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    Columns("A:N").Select
    Range("N1").Activate
    Columns("A:N").EntireColumn.AutoFit
    Columns("C:C").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
    Columns("F:G").Select
    Selection.Delete Shift:=xlToLeft
    Columns("G:H").Select
    Selection.Delete Shift:=xlToLeft
    Columns("H:I").Select
    Selection.Delete Shift:=xlToLeft
    Range("C2").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("G2:G250") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2:C250") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:G250")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    ChDir "C:\Users\Fatemeh\Desktop\Shoab"
    ActiveWorkbook.SaveAs Filename:="C:\Users\Fatemeh\Desktop\Bank\Mellat PM.xlsx" _
        , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWindow.Close
    Range("D231").Select
    ActiveSheet.ListObjects(sname).Range.AutoFilter Field:=7
End Sub
[/pre]

باز هم تشکر و ببخشید که زیاد شد

majid_mx4

  • مدیران انجمن
  • *
  • ارسال: 1751
  • جمع امتیازها: +630/-7
سلام خوشحالم که به نتیجه رسیدید

درجواب سوالهای شما بصورت خلاصه و مختصر

دیفالت اکسل جدول های یونیک راایجاد میکنه وهر جدول محدوده خاصی تعریف میشود یا بهتر بگویم بنوعی تمام صفحه اکسل را بصورت جدول میبیند مگر اینکه محدوده خاص را تعریف کنید.

منظور از عدد یک index Number  است جدول ها لیست میشوند و اولین جدول در صورت عدم دادن نام جدول به عنوان جدول اصلی دیده میشود .برای درک بهتر مطلب دستور زیر را با دو جدول در یک شیت تهییه نماییدو دستور را اجرا کنید بعد قسمت دوم یعنی دستورات مربوط به عدد 2 را پاک کنید و از جدول ها جدول یک را پاک کنید خواهید دید که نام جدول شماره 2 نمایش داده میشود .

Sub mir()
tname = ActiveSheet.ListObjects(1).Name

MsgBox tname
tname = ActiveSheet.ListObjects(2).Name
MsgBox tname
End Sub

تغییر نام جدول را بخاطر این گذاشتم فرض کنید که شما جدول جدید را لود کردید ولی در دستور شما نام جدول قبلی بود (البته در دستورات اولیه که فرستاده بودید) و جدول جدید لود شده نام دیگری دارد و دستورات را نمی تواند اجرا کند چون نام جدولی به آن نام پیدا نمی کند . اینجا دستورات ارسالی تغییر نام بدرد شما میخورد که جدول جدید لود شده را به نام جدولی که در دستورات داده اید تغییر دهید و خواهید دید که ماکرو اجرا میشود.یعنی اول جدول جدید را لود کرده و سپس بنام دلخواه تغییر دهید و بعد بقیه دستورات لازم جهت تغییرات جدول را اعمال کنید.
ضبط ماکرو فقط یکبار کافی است و با اصلاح ماکرو و دستور اجرای آن میتوانید آن را برای بارها استفاده کنید  .نه فقط اکسل بلکه اکثر زبانهای برنامه نویسی در بعضی از موارد با فارسی مشکل دارند .
 مشکل کلمه    "ی " از سایت نوع فونت  مرجع است که کدینگ زبان فارسی خود را با آن انتخاب کرده و عینا به اکسل منتقل میشود توصیعه میکنم اگر دستور به همان شکل کار میکند آن را تغییر ندهید. چون اونوقت هر بار باید اینکار را بکنید.

یا از دستورات تبدیل  ی  و رفع این خطا استفاده نمایید.

امیدوارم مفید واقع شود
پایدار باشید میر