ایجاد خطا در کدنویسی اکسل

نویسنده mahtab_g, 25 جون 2022, 14:32

« قبلی - بعدی »

mahtab_g

سلام خدمت همه ی دوستان و عرض ادب و وقت بخیر
معذرت میخوام من اطلاعاتی به صورت زیر دارم

و کدهای زیر رو براش نوشتم اما مشکل دارم
توی فرمول من اگه inflow رو از نوع دابل تعریف کنم خطای type mismatch رو در خط inflow = "=$E$2+(F2*(A2:A505-$E$2))+(D2:D505*$G$2*(1-$F$2^2)^0.5) دریافت میکنم .
اگه اصلا متغییر inflow رو تعریف نکنم اون خط خطا نمیده اما شر ط رو در نظر نیگیره و مقادیر منفی هم جزء نتایج من نمایش داده میشه .
تورو خدا کمکم کنید

Sub Macro1()


Dim Year, Month, seri As Integer
'Dim inflow As Double
Dim Qy, Vy, M, C, S As Double
For seri = 1 To 100
For Year = 1 To 42
For Month = 1 To 12
inflow = "=$E$2+(F2*(A2:A505-$E$2))+(D2:D505*$G$2*(1-$F$2^2)^0.5)"
If inflow <= 0 Then
inflow = 5.5
End If
Sheet1.Cells((12 * (Year - 1) + Month), seri + 11) = inflow
Next Month
Next Year
Next seri
End Sub


فرشید میدانی

سلام
نباید هم کار کنه 😉
در برنامه نویسی اکسل فرمول رو نمی توانید به صورت متن بنویسید و چون متن است اکسل آن را محاسبه نمی کند.
اگر میخواهید که inflow‌ را محاسبه کنید باید از همان cells که در برنامه استفاده کرده اید، برای اشاره به سلول ها استفاده کنید.
مثلا به جای اینکه بنویسید:
inflow = "A1 * 2"
باید بنویسید:
inflow = cells(1,1) * 2
⭐ اگر پاسخ خود را یافتید:

۱) در پاسخ گویی به سوالات انجمن اکسل فرساران مشارکت کنید.
۲)  دوره‌های[iurl="[url="https://www.farsaran.com/excel"]https://www.farsaran.com/excel[/url]"] اکسل فرساران[/iurl] را به همکاران سازمان خود معرفی کنید.
۳)  صفحه [iurl="[url="https://www.instagram.com/farsaran_excel/"]https://www.instagram.com/farsaran_excel/[/url]"]اینستاگرام farsaran_excel[/iurl] را 🧡 کنید.

Shahabsoltani1

نقل قولسلام خدمت همه ی دوستان و عرض ادب و وقت بخیر
معذرت میخوام من اطلاعاتی به صورت زیر دارم

و کدهای زیر رو براش نوشتم اما مشکل دارم
توی فرمول من اگه inflow رو از نوع دابل تعریف کنم خطای type mismatch رو در خط inflow = "=$E$2+(F2*(A2:A505-$E$2))+(D2:D505*$G$2*(1-$F$2^2)^0.5) دریافت میکنم .
اگه اصلا متغییر inflow رو تعریف نکنم اون خط خطا نمیده اما شر ط رو در نظر نیگیره و مقادیر منفی هم جزء نتایج من نمایش داده میشه .
تورو خدا کمکم کنید

Sub Macro1()


Dim Year, Month, seri As Integer
'Dim inflow As Double
Dim Qy, Vy, M, C, S As Double
For seri = 1 To 100
For Year = 1 To 42
For Month = 1 To 12
inflow = "=$E$2+(F2*(A2:A505-$E$2))+(D2:D505*$G$2*(1-$F$2^2)^0.5)"
If inflow <= 0 Then
inflow = 5.5
End If
Sheet1.Cells((12 * (Year - 1) + Month), seri + 11) = inflow
Next Month
Next Year
Next seri
End Sub





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


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

فرشید میدانی

بازهم در جهت تکمیل شدن این موضوع باید بگویم که در برنامه نویسی VBA‌ اکسل می توانید فرمولی را به صورت متن بنویسید و با تابع Evaluate آن متن را محاسبه کنید مانند:

msgbox evaluate("sum(2, 3, 4, 5) * left(22, 1)")اما شما می خواهید که فرمولی که می نویسید به صورت نسبی در سایر سلولها تغییر کنید، بنابراین ساده تر آن است که آدرس سلولها را بدهید. اگر چه می توانید بازهم  فرمول را به صورت متن با یک حلقه for و ... تولید کنید و هر بار از Evaluate برای محاسبه آن کمک بگیرید.
⭐ اگر پاسخ خود را یافتید:

۱) در پاسخ گویی به سوالات انجمن اکسل فرساران مشارکت کنید.
۲)  دوره‌های[iurl="[url="https://www.farsaran.com/excel"]https://www.farsaran.com/excel[/url]"] اکسل فرساران[/iurl] را به همکاران سازمان خود معرفی کنید.
۳)  صفحه [iurl="[url="https://www.instagram.com/farsaran_excel/"]https://www.instagram.com/farsaran_excel/[/url]"]اینستاگرام farsaran_excel[/iurl] را 🧡 کنید.

Shahabsoltani1

نقل قول از: فرشید میدانی در 04 جولای 2022, 12:29بازهم در جهت تکمیل شدن این موضوع باید بگویم که در برنامه نویسی VBA‌ اکسل می توانید فرمولی را به صورت متن بنویسید و با تابع Evaluate آن متن را محاسبه کنید مانند:

msgbox evaluate("sum(2, 3, 4, 5) * left(22, 1)")اما شما می خواهید که فرمولی که می نویسید به صورت نسبی در سایر سلولها تغییر کنید، بنابراین ساده تر آن است که آدرس سلولها را بدهید. اگر چه می توانید بازهم  فرمول را به صورت متن با یک حلقه for و ... تولید کنید و هر بار از Evaluate برای محاسبه آن کمک بگیرید.





سلام و عرض ادب
مهندس جان بنده خیلی با توابع اکسل آشنایی ندارم و بیشتر در حوزه های دیگه برنامه نویسی فعال هستم
اما این روشی که فرمودید بسیار خوب است ولی قطعا در محاسبات سنگین و البته پیچیده روش کاربردی و صحیحی نیست
حتی اگر در یک loop قرارش بدیم زمان محاسبات و پیچیدگی محاسبات ممکنه دردسر ساز بشه
این روش برای محاسبات ساده و کوچیک جواب میده اما برای محاسبات سنگین بعید میدونم کارامد باشه
بهر صورت چیز جدید و جالبی از اکسل یاد گرفتم
سپاس