Excel (VBA)

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

 
(指定なし : 指定なし)
セル内文字列の変換時、もとの文字色を変えたくない。[結合セルで使用できない]
投稿日時: 21/08/14 12:23:20
投稿者: tarima

結合セルを使用しているシートがありました。
 
simpleさんが教えてくれたコードを実行すると、
rng.Value(xlRangeValueXMLSpreadsheet) = myConvert(rng)の場所で
結合セルには使用できないというメッセージが表示されます。
 
以下のように、セルを1つにしてみても同じエラーです。
rng.MergeArea.Item(1).Value(xlRangeValueXMLSpreadsheet) = myConvert(rng.MergeArea.Item(1))
 
結合セルでも使用できる方法があれば教えて下さい。

回答
投稿日時: 21/08/14 13:48:14
投稿者: simple

どうも結合セルの一部を変更できないようですね。
対応するとすれば、その方針としては、
(1)結合セルの状況をdictionaryか何かに保存する
(2)いったん結合セルを解除する
(3)置換する
(4)結合セルを(1)の情報を元に復元する
といった感じになるのでしょうか。
トライしてみてください。

回答
投稿日時: 21/08/14 14:33:39
投稿者: マナ

はじめてで、投稿の仕方がわかりませんが
 
これでどうでしょうか。
rng.MergeArea.Value(xlRangeValueXMLSpreadsheet) = myConvert(rng.MergeArea)

回答
投稿日時: 21/08/14 15:44:42
投稿者: マナ

正規表現を使えば、UsedRangeに対して、一括で処理できそうです
 
1)Set rng = ActiveSheet.UsedRange
2)s = rng.Value(xlRangeValueXMLSpreadsheet)
3)正規表現で、置換
4)rng.Value(xlRangeValueXMLSpreadsheet) = s

回答
投稿日時: 21/08/14 15:45:04
投稿者: simple

さすがです。
思いつかなかったですな。
(私のは没で。(可能は可能ですが、無駄なことはしないほうがよい))
 

rng.MergeArea.Value(xlRangeValueXMLSpreadsheet) = myConvert(rng.MergeArea)
だけ使えばよさそうです。
結合セルで無い場合は、そのセル自体が適用されるので、結合セルかどうかの判定すら不要です。
(なお、.Value <>"" という判定は残しておいたほうがよいと思います。
  結合セルの先頭セル以外のセルを弾くために。)
 
余談:
 
A1:B1が結合されている場合、
・B1セルのValue(通常の)は、""を返しますが、
・[B1].Value(xlRangeValueXMLSpreadsheet)は、
  [A1].Value(xlRangeValueXMLSpreadsheet)とほぼ同じものを返します。
・しかも、A1ではなく、B1にだけ、
  <Cell ss:MergeAcross="1"という情報が入っています。
 
ということは、
xlRangeValueXMLSpreadsheetを使用するときは、個別セルの値には意味が乏しく、
MergeAreaに対してだけ意味があるということなんでしょうか。
 
正規表現による置換はVBASCriptでは面倒です。書いてはみましたが。

回答
投稿日時: 21/08/14 16:10:49
投稿者: マナ

正規表現はほとんど理解していないので、
ミヨウミマネで、こんな感じで試してみました。

With CreateObject("VBScript.RegExp")
    .Pattern = "<Cell[\s\S]*?</Cell>"
    .Global = True
    For Each m In .Execute(s)
        s = Replace(s, m.Value, StrConv(m.Value, vbNarrow))
    Next
End With

全く自信ありません。
問題点をご教示いただけないでしょうか。
 
 
これ

回答
投稿日時: 21/08/14 19:12:25
投稿者: マナ

そうか、これだと、全セルにマッチして
とてつもなく無駄に置換することになっちゃいますね。
 

回答
投稿日時: 21/08/14 19:13:24
投稿者: simple

外出から戻りました。
 
恐れ入りました。ペコリ。
私は別のマッチパターンを考えてしまっていました。うーむ、日暮れて道遠し。
これで完成ですね。

投稿日時: 21/08/15 10:56:49
投稿者: tarima

みなさん、何度もていねいに教えて下さり、本当にありがとうございます。とても助かりました!
 
数式セルはオーバーフローというエラーになるため、数式セル以外として全部の処理ができました。
 
For Each rng In ws.UsedRange
      With rng
        If Not .HasFormula Then
          If .Value <> "" Then
              .MergeArea.Value(xlRangeValueXMLSpreadsheet) = myConvert(.MergeArea)
          End If
        End If
      End With
Next rng