Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
Excelを新元号対応にしたところ、エラー発生しました!
投稿日時: 19/05/14 10:05:45
投稿者: kokoichi

MS-Offceを新元号対応にしたところ、前任者が作成した年間スケジュール(Excel VBA)に
次のエラーが発生しました。
 
Sheet名[31年4月]までは正常でしたが、Sheet[1年5月]を作り掛けると
「実行時エラー'13' 型が一致しません」となり
「 intI = CInt(Mid(strBuff, 1, 2)) + 1988」行が黄色となります。
 
また、以下1行目の「/」を外すと、Sheet[1年9月]まで作成後、同様のエラー表示になります。
(桁数が問題かと色々探して見てみましたが...)
 
解決方法のご教示をお願いできれば助かります。
 
 
strBuff = Replace(strDate, "年", "/")         ---->strDate "1年5月" strbuff ""      int:10
strBuff = Replace(strBuff, "月", "/")         ---->strDate "1年5月" strbuff "1/5月"  int:10
strBuff = Trim(StrConv(strBuff, vbNarrow)) & "01"   ---->strDate "1年5月" strbuff "1/5/"   int:10
intI = CInt(Mid(strBuff, 1, 2)) + 1988         ---->strDate "1年5月" strbuff "1/5/01"   int:10
strBuff = CStr(intI) & Mid(strBuff, 3, 6)
 
 
ちなみにSheet名[31年4月]の場合は以下のようになります。
 
strBuff = Replace(strDate, "年", "/")         ---->strDate "31年4月" strbuff ""      int:10
strBuff = Replace(strBuff, "月", "/")         ---->strDate "31年4月" strbuff "31/4月" int:10
strBuff = Trim(StrConv(strBuff, vbNarrow)) & "01"   ---->strDate "31年4月" strbuff "31/4/"  int:10
intI = CInt(Mid(strBuff, 1, 2)) + 1988         ---->strDate "31年4月" strbuff "31/4/01"  int:10
strBuff = CStr(intI) & Mid(strBuff, 3, 6)       ---->strDate "31年4月" strbuff "31/4/01"  int:2019
strBuff = DateAdd("m", -3 ,strBuff)          ---->strDate "31年4月" strbuff "2019/4/01" int:2019

回答
投稿日時: 19/05/14 10:45:42
投稿者: sk

引用:
MS-Offceを新元号対応にしたところ、前任者が作成した年間スケジュール(Excel VBA)に
次のエラーが発生しました。

引用:
Sheet[1年5月]

引用:
intI = CInt(Mid(strBuff, 1, 2)) + 1988

「平成の年(他の元号の年かも知れない可能性を完全に無視)を西暦年に修正する」
というロジック自体が既に陳腐化していますので、ワークシートの命名規則も含めて
全面的な改修を検討なさった方がよいと思います。
 
引用:
実行時エラー'13' 型が一致しません

引用:
intI = CInt(Mid(strBuff, 1, 2)) + 1988

・この時の strBuff の値が "1年5月" である場合、
 Mid 関数の戻り値は "1" となる。
 
・"1" のような「数値データとして解釈できない文字列」を
 CInt 関数によって型変換することは出来ない。
 
・仮に "1" や "31" のように「"年"の前にある数字文字列」を
 抜き出すようにしたとしても、抜き出した数字文字列が
 どの元号での年を表しているのかが不明瞭なままである。
 (和暦年どころか、西暦年2桁とも解釈のしようがある)

回答
投稿日時: 19/05/14 13:23:02
投稿者: WinArrow
投稿者のウェブサイトに移動

そもそも
>「 intI = CInt(Mid(strBuff, 1, 2)) + 1988」行が黄色となります。
MID関数で先頭から2桁取得ですから「1年」を数値化しようとしています。
また、2桁の数値+1988
という、この考え方が、「平成」のみ適用できるものなので
「1年5月」にしたとき、
仮に先頭1桁を取得できたとしても
平成1年になってしまいます。(1+1988 →1989)
 
この考え方を変えない限り、
小手先だけで対応しても、ダメでしょうね??
 
 
 

回答
投稿日時: 19/05/14 19:36:31
投稿者: WinArrow
投稿者のウェブサイトに移動

推奨
 
ソート名を西暦年月にすることをお勧めします。
 例
 2019年4月
  
全角でも半角でもよいでしょう。
 全角ならば、StrConv関数で対応できますよね
 
 
こうすれば、足し算も必要なくなりますよね・・・・

回答
投稿日時: 19/05/14 22:41:29
投稿者: WinArrow
投稿者のウェブサイトに移動

説明が込み入っているので、パスして
strBuffいは、「1年5月」が入っていると勝手に思っていましたが、
>「 intI = CInt(Mid(strBuff, 1, 2)) + 1988」行が黄色となります。
この時点の「strBuff」には、[1/5」という値が入っているんですね・・・
  
Mid関数で、先頭から2桁・・・つまり「1/」をCint関数で数値化しているわけですので
 それはエラーになるのは、当然です。(「1年」ということでも同じですが・・)
  
なお、このようなことを検証するには、ステップ実行という方法gがあります。
 「F8」を使い、1命令づつ進めていって、その都度、または、任意のところで、
 変数の値を確認することができます。
ステップ実行をう使えば、初歩的なエラーは、解消することができます。
  
今回の処理は、シート名から、西暦年を計算する処理ですよね?
シート名を西暦に変更することができれば、
ここで掲示したコードは不要になります。
 是非、検討してみてください。
  
例:シート1の名前が「2019年5月」と仮定して
↓のコードで、yyyy/mm/dd形式の日付に変換できます。
  
Dim strdate As String
     strdate = DateValue(StrConv(Sheets(1).Name, vbNarrow) & "1日")
 
 
どうしても和暦のシート名が必要でしたら
「令和元年5月」または「令和1年5月」
のように元号をつけても、↑のコードでyyyy/mm/dd形式の日付に変換できます。
Replaceなど使う必要もありません。

投稿日時: 19/05/15 09:12:25
投稿者: kokoichi

sk様 WinArrow 様
 
おはようございます。
いろいろお手数をお掛けしております。
この件に関して他のファイルと複合的に絡んでいることが昨日遅く
判明しましたので、再度改めて質問をさせて頂ければと考えています。
その際は(も)宜しくお願いいたします。
※とりあえず「解決済みにする」を選択させて頂きます。