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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for tsuda.a tsuda.a
October 05, 2015

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

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

Avatar for tsuda.a

tsuda.a

October 05, 2015

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. 最後に作業用のワークシートを削除する。