Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Excelのどうでもよいtipsの紹介

tsuda.a
October 05, 2015

 Excelのどうでもよいtipsの紹介

Excelのどうでもよいtipsの紹介

tsuda.a

October 05, 2015
Tweet

More Decks by tsuda.a

Other Decks in Programming

Transcript

  1. ポイントは2点 • 呼ばれ元のシート名が分からない • Application.Caller.Worksheet.Name (*1) で求める (ActiveSheet.Name だと、うまくいきません) •

    シート名を変更しても、セル側の表示が連動しない • Application.Volatile (*1) を指定する (*1) 個別の意味の詳細はぐぐって下さい
  2. マクロで… • 無理(汗 難易度が高すぎる。 • 条件付き書式の適用結果示すプロパティが存在しない。 • たとえば、Range(“~”).Interior.Color をみても、条件付き書式の適用前の色しか取得できない。 •

    無理にマクロで頑張る場合、条件付き書式を解析する必要がある。  Range(“~”).FormatConditions(n) を一つ一つみて、条件が適合しているかを判断する必要がある。
  3. そこで Word ! ① Excel でコピー ② Word に貼り付け ③

    Word でコピーしなおし ④ Excel に貼り直し
  4. Word を買ってない人はどうすればいいのか? • 同じことは VBA とPowershell (*1) を使って、できないこともない (汗 Sub

    PasteDisplayInterior() Set wsh = CreateObject("WScript.Shell") cmd = "Powershell -sta -command " _ & """" _ & " Add-Type -an System.Windows.Forms; " _ & " $a = [System.Windows.Forms.Clipboard]::GetData('HTML Format'); " _ & " [System.Windows.Forms.Clipboard]::Clear(); " _ & " [System.Windows.Forms.Clipboard]::SetData('HTML Format', $a); " _ & """" wsh.Run cmd, 0, True ActiveSheet.Paste End Sub 要するに HTML (*1) Powershell の使用は個人的な好み。
  5. その VBA のコード (1) Sub AutoFitHeight() ' 対象のセルを決定 Dim targetCell

    As Range Set targetCell = ActiveCell ' 「折り返して全体を表示」を設定 targetCell.WrapText = True
  6. VBA のコード (2) ' 枠の幅 Dim borderWidth As Variant borderWidth

    = 0.63 ' 連結したセルの幅を計算 Dim totalWidth As Variant Dim x As Range totalWidth = -borderWidth For Each x In targetCell.MergeArea.Columns totalWidth = totalWidth + x.ColumnWidth + borderWidth Next この値は当て推量かつ固定(汗
  7. VBA のコード (3) ' 作業用のWorkBookを作成 Dim work As Worksheet Set

    work = ThisWorkbook.Sheets.Add ' 作業用のシートに、対象のセルをコピー targetCell.Copy work.Paste ' 貼り付けたセルのセル結合を解く Selection.UnMerge
  8. VBA のコード (4) ' 計測した対象セルの幅を、貼り付け先のセルの幅に設定し、自動調整を実行 ActiveCell.ColumnWidth = totalWidth ActiveCell.EntireRow.AutoFit '

    自動調整で得たセルの高さを、対象のセルに設定 targetCell.RowHeight = ActiveCell.Height ' 作業シートの削除 Application.DisplayAlerts = False work.Delete Application.DisplayAlerts = True End Sub
  9. なにをやっているのか? • 結合セルでは自動調整できないので、単一セルに内容をコピーして自動調整させる。 • そのために、作業用のワークシートを作成し、そこに対象のセルをコピーする。 (元シートで操作せず他のシートにコピーするのは、元シートへの影響を極力排除したいためです) • おおよそ以下の手順で作業。 1. 対象の結合セルの幅を計測する。

    2. 作業用のワークシートを追加。 3. 対象の結合セルを、作業用のワークシートにコピーする。 4. コピー先のセルの結合を解除し、単一セルにする。 5. 上記 1. で計測したセル幅を、コピー先のセルに適用し、高さの自動調整をする。 6. 自動調整で得た高さを、対象のセルの高さとして設定する。 7. 最後に作業用のワークシートを削除する。