2018年7月19日木曜日

【マクロ】セルに数式を記入する方法

↓エラーが出る書き方
Range("A1") =
"=LEFT("tanaka",2)"

文字列は""(ダブルコーテーション)で囲みます。逆に言えば、""(ダブルコーテーション)で囲まれているのは文字列と認識されます。すると、数式として入力しようとしたデータは、「=LEFT(」という文字列+「tanaka」というコマンド名+「,2)」という文字列という訳の分からないデータになってしまいます。
「tanaka」を囲む""(ダブルコーテーション)を、文字列の区切りである""(ダブルコーテーション)ではなく、単なるデータとしての""(ダブルコーテーション)とするには、""(ダブルコーテーション)を2つ重ねて記述します。


Range("A1") = "=LEFT(""tanaka"",2)"

これで正しく「=LEFT("tanaka",2)」という数式を入力できます。
ワークシート関数には""(ダブルコーテーション)がひんぱんに使われます。マクロでセルに入力するときには、十分注意して下さい。



2018年7月13日金曜日

【Blender】拡大縮小の時の中心

デフォルトではピボットポイントがアクティブ要素になっているため
拡大縮小をするときにミラーを入れていると割れたり重なったりする。※図1
ピボットポイントを3Dカーソルにすると3Dカーソル(紅白の円)を中心に
拡大縮小できる。※図2・3




図1
図2
図3



【マクロ】A列に値があればB列に連番を入れる

A列に値があればB列に連番を入れる

Sub Macro1()
    Dim i As Long
    Dim N As Long
    For i = 2 To Range("A2").CurrentRegion.Rows.Count
        If Cells(i, "A").Value <> "" Then
            N = N + 1
            Cells(i, "B").Value = N
        End If
    Next i
End Sub



A列に値があればB列にその日の日付を入れる

Sub Macro2()
    Dim i As Long
    For i = 2 To Range("A2").CurrentRegion.Rows.Count
        If Cells(i, "A").Value <> "" Then
            Cells(i, "B").Value = Date
        End If
    Next i
End Sub

2018年7月10日火曜日

【マクロ】セルの数式が計算された時に実行されるイベントプロシージャ

セルの数式が計算された時に実行されるイベントプロシージャとして Worksheet_Calculate イベントがあります。
これを活用されると良いでしょう。

監視対象セル以外のセル範囲に数式が設定されていると、その再計算時にもイベントが発生しますので
別に作業用シートを用意したほうが無難。

例えば Sheet1 の X10 セルの関数の戻り値を監視したい場合。
1)新規シートを追加して、監視用シートとする。
2)追加した監視用シートの A1 セルに 数式で =Sheet1!X10 ..などのように監視対象のセルを参照。
3)監視用シートのシートモジュールに以下のプロシージャを置く。
Private Sub Worksheet_Calculate()
  If Range("A1").Value <> Range("B1").Value Then
    Range("B1").Value = Range("A1").Value
    MsgBox "change"
  End If
End Sub

基本的に、Sheet1 の X10 セルの数式が計算されて値が変化した時にCalculateイベントが発生しますが、
数式の内容によっては、値が変わらなくてもCalculateイベントが発生するケースもあります。
また、Sheet1の行削除や挿入時などでもCalculateイベントは反応します。
なので前回計算時の値を別セルに記憶させておいて、値を比較する必要があります。
前述の例では、A1に参照数式があるとして、B1セルを記憶用セルとして使うようにしています。

【マクロ】エクセルの行列幅のみコピペ

通常では形式の貼り付けで列幅だけは貼り付けられるが、
行幅だけはコピペ出来ない。

まずは貼り付けたい箇所を選択し下記のマクロを実行する。
貼り付け先を指定するインプットボックスが出るので
直接入力するか、貼りたい場所をクリックする。
A1:G50を選択し、貼り付け先をB1にする。
この時は行幅だけ反映される。
A1:G50を選択し、貼り付け先をB列を指定する。
これで行、列幅共に反映される。

※貼り付け先を別ブックでも指定できるが行幅だけしか反映されないので
 貼り付け後に形式を選択して貼り付けで列幅を貼ればよい。

Sub 列幅も行高もコピー()
    'コピーする範囲を選択してから実行
    Dim i As Long
    Dim gyosu As Long
    Dim myRange As Range
    Dim doko As Range
    Dim saki As Range
    Set myRange = Selection
    gyosu = myRange.Rows.Count
    ActiveSheet.Select
    Set doko = Application.InputBox("コピー先の先頭セルを選択", Type:=8)
    Set saki = doko.Resize(gyosu, myRange.Columns.Count)
    myRange.Copy
    Range(doko.Address).Select
    ActiveSheet.Paste
    Selection.PasteSpecial Paste:=xlPasteColumnWidths
    Application.CutCopyMode = False
    For i = 1 To gyosu
        saki.Rows(i).RowHeight = myRange.Rows(i).RowHeight
    Next
End Sub


2018年7月4日水曜日

【マクロ】エクセル マクロ 範囲を拡張して消す

A列で任意の範囲を選択しdeleteキーを押すと
同範囲の隣の列も消す。

例えば、A5からA10まで選択し値を消す。
B5からD10までの値も同様に消したい。
A15からA50までを選択し消せば
B15からD50も消える。
A20を消せばB20からD20も消える。

選択する範囲は必ずA列のどこかで
消すときに値のみ消す。

シートモジュール
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Range
  If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub
  If Target.Count <= 1000 Then 
   Application.EnableEvents = False
    For Each c In Target
     If c = "" Then
      c.Offset(, 1).Resize(, 3).ClearContents
     End If
    Next c
   Application.EnableEvents = True
  End If
End Sub