年月日を加工してから代入する際にエラーが出てしまう

表題の通り代入時にエラーが出てしまいます。

やりたいこと
Aのエクセルから2つの年月日を抜き出し、1年追加した後、
Bのエクセルに20XX年XX月XX日~20XX年XX月XX日と書き込みたいです。

【代入式】
kaishi1 = kaishibi
kaishi2 = datetime.Parse(kaishi1)
kaishi2 = datetime.parse(kaishi2.tostring(“yyyy/MM/dd”)).addYears(1)
kaishi3 = kaishi2.ToString(“D”,ci).Substring(0,10)

【変数】
名前:kaishibi 変数の型:GenericValue
名前:kaishi1 変数の型:GenericValue
名前:kaishi2 変数の型:DateTime
名前:kaishi3 変数の型:String
名前:ci 変数の型:CultureInfo

これで書き込めても、書き込める時とエラーが発生する時があります。
エラーが発生する時は月と日付の桁数が短いとエラーになるようです。
デバッグで確認すると桁数が短いとsyuuryoubi1と3の値が取れなくなってしまいます。(Substringを(0,9)にするとエラーは出ません)
日付と月が2桁の場合、20XX年XX月XX というようになってしまい”日”が書き込んだ際に無くなってしまいます。

Substring(0,10)の10を編集すればエラーが消えますが、違う年月日を抜き出したときに桁数が違うとエラーになります。

うまく説明できなくてすいません、何かいい方法はありますでしょうか。

エラー内容
ソース: stringへ代入

メッセージ: インデックスおよび長さは文字列内の場所を参照しなければなりません。
パラメーター名:length

例外の種類: System.ArgumentOutOfRangeException

IncludeExceptionDetailInFaults=true により作成された可能性のある ExceptionDetail の値:
System.ArgumentOutOfRangeException: インデックスおよび長さは文字列内の場所を参照しなければなりません。
パラメーター名:length
場所 System.String.Substring(Int32 startIndex, Int32 length)
場所 lambda_method(Closure , ActivityContext )
場所 Microsoft.VisualBasic.Activities.VisualBasicValue1.Execute(CodeActivityContext context) 場所 System.Activities.CodeActivity1.InternalExecuteInResolutionContext(CodeActivityContext context)
場所 System.Activities.Runtime.ActivityExecutor.ExecuteInResolutionContext[T](ActivityInstance parentInstance, Activity1 expressionActivity) 場所 System.Activities.InArgument1.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance activityInstance, ActivityExecutor executor)
場所 System.Activities.RuntimeArgument.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance targetActivityInstance, ActivityExecutor executor, Object argumentValueOverride, Location resultLocation, Boolean skipFastPath)
場所 System.Activities.ActivityInstance.InternalTryPopulateArgumentValueOrScheduleExpression(RuntimeArgument argument, Int32 nextArgumentIndex, ActivityExecutor executor, IDictionary2 argumentValueOverrides, Location resultLocation, Boolean isDynamicUpdate) 場所 System.Activities.ActivityInstance.ResolveArguments(ActivityExecutor executor, IDictionary2 argumentValueOverrides, Location resultLocation, Int32 startIndex)
場所 System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

Substringでするとなかなか大変だと思います。CultureInfoのフォーマットは確かにja-jpの場合0が表示されませんので1桁しか表示されないことがあります。CultureInfoのフォーマットが適用ではなければ、DateTimeにある年、月と日の情報だけを取得すればいいと思います。

言葉で少し分かりにくいかと思いますので、簡単なWorkflowを作ってみました。ご参照ください。

DateWorkflow.xaml (9.9 KB)

2 Likes

ありがとうございます!
2桁にする場合の式を組み込んだら無事実現することができました!

なるほど、CultureInfoは0をカウントしてくれないんですね。
エクセルのユーザー定義で0をみえるようにしたりしても、エラーが出続けたのはそういうことだったんですね。
SubstringではなくToStringで取得して、年、月、日つけてあげるといいんですね。

勉強になった上にサンプルまでいただき、やりたいことも実現できて大変助かりました!