Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
Re: セル内文字列の変換時、もとの文字色を変えたくない。[結合セル] の tarimaさんへ
投稿日時: 21/08/17 00:10:25
投稿者: simple

遅くなってすみませんが、下記スレッドの件で、少し教えて下さい。
https://www.moug.net/faq/viewtopic.php?t=80821
 
>数式セルはオーバーフローというエラーになるため、数式セル以外として全部の処理ができました。

ちょっと想定しにくいので、どのようなセルなのか、もう少し具体的に教えていただけませんか?

回答
投稿日時: 21/08/17 19:45:31
投稿者: マナ

もう見ていないかもしれませんね。
 
>数式セルはオーバーフローというエラーになるため、
 
再現できませんでした。
 
試してみて、気がついたこと。
 
rng.Value(xlRangeValueXMLSpreadsheet)
 
rng内の数式セルが、rng外を参照していると
そのセルの数式情報がなくなるようです。
(整合性がとれなくなるリスクがあるので当然かもしれません)
 
従って、1セルずつ処理するときは
オーバーフローの件はともかく、
数式セルの除外は必須みたいです。
 
シート一括処理の場合も、他シート参照があると同じでした。
 
For each a in ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
 
のように、Areaごとに処理するくらいしか思いつきませんでした。

投稿日時: 21/08/17 21:15:24
投稿者: simple

コメントありがとうございます。
 
私の手元でも当該エラーは再現しませんでした。
 
さて、
rng.Value(xlRangeValueXMLSpreadsheet)はあくまでValueなので、
数式情報はもともと持たず、その結果の値(と書式)だけを持つはずです。
 
今回の処理を適用すると、その結果文字列を半角化した文字列で
セルが上書き更新されるだけで、エラーにはならないのかな、と思った次第です。
もちろん数式はなくなります。
 
数式セルはもともと、部分的に文字書式を変えることができないのですが、
数式が文字列に更新されてしまうことは、所期することではないのでしょう。
 
対応策としては、
セル範囲全体をバックアップを別の個所に持っておいて、
処理後に個々に数式に戻すといったことをすればよいのかと思います。
 
いずれにせよ、このマナさん方式とでも呼ぶ方法は、
セルごとにするとスピードはかなり落ちてしまうので、
できるだけ広い範囲のセルを対象に実行するのが重要かと思いました。
(スタイルなどを繰り返し相手にして除外するのもロスですし、セル単位の書き込みより
一括して書き込むのが早いのは、配列利用と類似かなと思います。)
 
数式セルでエラーが起きるという事象の原因がわかれば、
マナさん方式がさらに有効に使えるのかなと思い、
質問者さんからの情報を待ってみたいと思っています。

回答
投稿日時: 21/08/17 22:08:49
投稿者: マナ

確かに、利用しながら想定外の事象については
ひとつずつ解決していければよいですね。
 
以前、半平太さから提案のあった
s = Replace(s, vbCrLf, "")
なんかもそうでした。
 
セル範囲で取得すれば、数式情報も含まれるようです。
それがよいことか悪いkとかは、ケースバイケースだと思いますが。
こんなシートで半角に変換すると、B2セルの数式は残り、結果は3になりました。
 

   A    B
1  ア   2
2  イ	
3  ア	
4  a	
5  ア

B2:=COUNTIF(A1:A5,"ア")

投稿日時: 21/08/18 23:30:02
投稿者: simple

色々と試して、やっとマナさんのご指摘の理解に至りました。(汗、汗)
For each a in ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Areas
がたしかに最終形だと思われますね。
 
おかげさまで、XMLSpreadsheet形式についての理解が進みました。
 
(2)
余談ですが、他シート参照についても Formula式を同時に得たいということがもしあれば、
シートそのものを "XMLスプレッドシート 2003"という形式で保存する、
という荒技があるかなと思いつきました。(何に役立つか不明ですが)
 
なお、名称からしてもこのXMLSpreadsheet形式というのは、結構昔からあるようですね。
私は、最近教えてもらって気づいたところでしたが。
rng.Value(xlRangeValueXMLSpreadsheet)というのは、
そのサブセットという位置づけなんでしょうか。
(3)
質問者さんの遭遇したケースは、数式の置換の結果、
0割のようなものがあってエラーになったということなんでしょうかね。
 
もう少し開けておきます。

トピックに返信