www.smiyasaka.com は、 2019 年2月から SSL 化し 通信を暗号化した方式で発信をしています。

● 仕事に役立つExcelマクロの作り方 ●

アクセス数 昨日 7 今日 1
  累計 13,578   

私は、長年仕事上多数のマクロを作成し、仕事の効率化を図ってきました。
私は、すべてのマクロのExcelブックを、単独マクロのブックとして作成し、実行時に、データのブ ックと一緒に開き、データを操作するという方法で゛データ処理を可能にしてきました。
更に、固定的なデータは、マクロブック内ののシート名を「 表紙 」としたシート上に記述し、簡単 な変更が あっても、マクロ本体の変更が、極力ないような作り方を実現しています。
このシートを私は、
マクロの表紙と勝手に名付けて呼んでます。
本ページでは、それらのテクニック的なことを、 整理し公開してます。
内容のレベルは、簡単なマクロ程度なら、自分でプログラミングできる人を対象にしています。
[ 事前のお断り ]
プログラミングの手法は、他によい方法が沢山あると思いますが、私は、以下に紹介する方法でプログ ラミングしてきましたので、そのマクロを 公開・解説しています。 更に、見本のマクロを極力ダウンロード可能にもしています。
私のホームページでダウンロードしたExcelマクロは、このページの手法で作成しています。

※ 注 意 事 項 ※
コマンド・プログラム等を コピペ する時には、全角のスペース が、入っていることがありますので
半角に変換 してから、使用してください。

スマホ対策の為、長いコマンド・プログラム等を継続記号( linux は、"\" 、EXCELマクロは、"_" )で
故意に数行に分割している箇所が有ります。

目    次
[○○○○]のクリックで、その内容が目次の下に表示、再度クリックで非表示になります。

   ※ [ 総てを表示する ] ※ [ 総てを表示する 非表示 ] ※
  1. [ Excel2002・2003と2007・2010との互換性 ] [ Excel2002・2003と2007・2010との互換性 非表示 ]
  2. [ マクロをバックグラウンドで動く様にする方法 ] [ マクロをバックグラウンドで動く様にする方法 非表示 ]
  3. [ 関数を使い処理のスピードアップをする ] [ 関数を使い処理のスピードアップをする 非表示 ]
  4. [ フォームのテキストボックス・コンボボックスを使う時の注意 ] [ フォームのテキストボックス・コンボボックスを使う時の注意 非表示 ]
  5. [ 変数の定義 Public と Dim の違い ] [ 変数の定義 Public と Dim の違い 非表示 ]
  6. [ 上書き保存してExcelを終了させる方法 ] [ 上書き保存してExcelを終了させる方法 非表示 ]
  7. [ 自分以外の人にマクロを使わせる時の作り方の注意 ] [ 自分以外の人にマクロを使わせる時の作り方の注意 非表示 ]
  8. [ 計算式をマクロでセルに書き込む ] [ 計算式をマクロでセルに書き込む 非表示 ]
  9. [[ファイルを開く]ダイアログボックスでネットワークドライブを開く方法] [[ファイルを開く]ダイアログボックスでネットワークドライブを開く方法 非表示]
  10. [ 張付けた写真を固定し変更出来ないようにする方法 ] [ 張付けた写真を固定し変更出来ないようにする方法 非表示 ]
  11. [ セルに設定されている関数を取り除き計算結果だけにする方法 ] [ セルに設定されている関数を取り除き計算結果だけにする方法 非表示 ]
  12. [ ブック間でまとめて( 任意の複数セル・結合セルOK )転記するマクロ ] [ ブック間でまとめて( 任意の複数セル・結合セルOK )転記するマクロ 非表示 ]
  13. [ 現場で役立つ完全フリーの土木測量計算プログラムの紹介 ] [ 現場で役立つ完全フリーの土木測量計算プログラムの紹介 非表示 ]
  14. [ Excel VBA の編集画面( VBE ウィンドウ )を元に戻す方法 ] [ Excel VBA の編集画面( VBE ウィンドウ )を元に戻す方法 非表示 ]
---------------------------------------------------------------------------------

1. Excel2002・2003と2007・2010との互換性

私か゛マクロを使用している範囲で、2002、2003と、2007、2010の違いは、ワードアートの扱い・ マクロからのブック・シートの操作位です。
セルだけの操作の場合、99% は、動作しています。ただし、拡張子は、.xlsm に変更すること。
逆に、Excel2007・2010のブックをExcel2002・2003で使うには、Microsoftのサイトから、 Word/Excel/PowerPoint 用 Microsoft Office 互換機能パックをダウンロードし、インストールします。
ただし、2007・2010固有の処理は、サポートされませんので、エラーになります。

一例として Excel2007 からのバージョンでシート上にマクロ実行ボタンを作成した時に、ボタン 等を ActiveX コントールで作成すると互換モードとはいえ Excel2002・2003 では ActiveX コン トールのエラーになります。

その時には、フォームコントロール側でボタン等を作成すれは゛防げるようです。 但し、ボタン等 の色の設定ができなくなります。
色を付けたい時には、オートシェイプの四角形でボタンを作成すれば自由に色付けができます。


2. マクロをバックグラウンドで動く様にする方法。

下記の方法は、私が採用している方法です。他にも、良い方法が有ると思います。

@ マクロをバックグラウンドで動く様にするには、下記の様に、 module1の先頭に、Public Constで、ブック名・シート名を宣言しておきます。
このようにすると、本ブック内のマクロで、変数名が共通に使えるようになります。
私は、極力変数の宣言は、module1の先頭で Public で宣言するようにしています。
(例)

	Public Const AAname As String = "シートの操作マクロ.xlsm"
	Public Const BBname As String = "表紙"
	Public x, y, x1, y1, x2, y2, x3, x4 As Long
	Public N, N1, N2, N3, N4, NN, Bcnt, ii, CNT As Integer
	Public AAA, BBB, CCC As String

次に、操作するブックのブック名・シート名を処理に、入るときに、マクロの表紙に保存し、処理 時は、保存したブック名・シート名を使用して処理します。特に、ブック・シートを切り替え ながら処理したい時は、必ず必要です。

切り替えのないときには、単に、ActiveSheet.Cells(縦位置, 横位置).value でOKです。
マクロの表紙のデータの参照は、
ex. Workbooks(AAname).Sheets(BBname).Cells(1, 10).Value
と記述してします。

ブック名・シート名の保存は、

ex. Workbooks(AAname).Worksheets(BBname).Cells(4, 2).Value = ActiveWorkbook.Name
  Workbooks(AAname).Worksheets(BBname).Cells(5, 2).Value = ActiveSheet.Name
  の様にします。
上のデータを使って、ブック・シートをアクティブにするには、下記の様にします。

ex. Bname = Workbooks(AAname).Worksheets(BBname).Cells(4, 2).Value
  Sname = Workbooks(AAname).Worksheets(BBname).Cells(5, 2).Value
  Windows(Bname).Activate
  Worksheets(Sname).Activate

A 内部で使う、定数等をマクロのブック内のシート上(マクロの表紙)に書き込み使用する。
特に、読書きしたいセルの位置情報・固定したい値等をマクロの表紙に書き込み、この値を使用し て処理させる事により、変更があった時にも、簡単に対処ができるようになります。

ex. CNT = Workbooks(AAname).Sheets(BBname).Cells(1, 10).Value
  AAA = " "
  For ii = 1 To CNT
   AAA = AAA & "," & Workbooks(AAname).Sheets(BBname).Cells(ii + 1, 10).Value
  Next ii
B マクロのブック名をマクロ内で固定しない方法 (その1)

1. マクロのブック名を自由に変えたい場合には、ブック名の変数を次のように宣言します。

  Public AAname As String  
<-- 必ず Public で宣言して下さい。
2. マクロが最初に実行される箇所に、ブック名を保存するステートメントを記述します。

  AAname = ActiveWorkbook.Name

C マクロのブック名をマクロ内で固定しない方法 (その2)

オブジェクト定義を使用してブック名を定義します。

1. ブック名の変数を次のように宣言します。(例)

  Dim AAname As String
  Public W_Book As Workbook  
<---- ブック名を定義する変数名の宣言。

2. マクロが最初に実行される箇所に、ブック名を定義するステートメントを記述します。

  AAname = ActiveWorkbook.Name   
<---- ブック名を変数に代入する。
  Set W_book = Workbooks(AAname) 
<---- ブック名を W_book と定義する宣言。

以後、ブック名を定義は、W_book だけで済むようになります。
例としてこんな具合になります。

        Workbooks(AAname).Activate
         ↓  ↓
        W_book.Activate


3. 関数を使い処理のスピードアップをする。

○ シート上で関数を使用して、プログラムの簡素化とスピードアップ図りましょう。

下記の様に、関数を使用するとプログラムも簡単になるし、特に、検索をマクロで書くと、 処理が長くなり、処理の仕方によっては、暴走することもあります。
関数にするとスピードアップにもなり、一石二鳥になります。

関数を使って検索する例として、( 例 1 )として、表から、求める所得税のように、対象となる数 値が、どこの 範囲に入るかを求め、その位置から、結果を求めるやり方。
( 例 2 )として、ダイレクトに一致する位置を求め るやり方を紹介します。

@ 例 1

表( 下記表 3.1, 3.2を参考 )から所得税を取得する方法

セル 2,10 には、マクロで、所得税を取得したい対象金額を書込みます。
セル 5,10 〜 表の終わりまで、関数 =AND(RC[-9]<=R2C10,R2C10<RC[-8]) を書き込む

RC[-9] は、相対参照、つまり、式のあるセル位置基準に左方向 9個目のセルを参照しています。
R2C10 >は、絶対参照、つまり、セル位置(2,10)を固定参照しています。

この処理は、セル 2,10 の金額と左の金額範囲をチェックし、
範囲に入っている時 --> true にする、
範囲に入っていない時 --> false にする。

セル 4,10 に、MATCH の検索文字 "true" を書き込む
セル 3,10 に、関数 =MATCH(R[1]C,R[2]C:R[147]C,0) を書き込む>この処理は、セル 4,10 の 内容(true)と 同じ内容が相対セル位置 2 〜 表の終わりまで(相対位置147)をチェックし、その セルの相対位置が書き込ま れます。

該当ないときには、エラーになるので、注意してください。
エラー処理をするには、例 2 の方法で行ってください。


              表 3.1 関数の式の書込み位置

                                 表 3.2 所 得 税 税 額 表

所得金額と扶養家族から、所得税を表検索するマクロを公開しています。
下記からダウンロードしてください。

※ 簡単な機能説明 ※
@ 給与の計算結果は、計算書から、個人に渡す明細書へ転記は、ボタンクリックだけできます。
A 給与計算書・明細書は、ボタンクリックだけでシートの後ろへ、月名を付けてコピーできます。
B コピーした給与計算書・明細書は、書き変えできないように保護かけています。
セルの保護の解除・保護の設定は、「セル操作マクロ」で簡単にできます。
C このマクロは、ある企業が現在使用しているマクロから、一般企業用に編集しなおしたマクロな ので、そのまま使用することが出来ると思います。
D 給与計算書は、固定給・日給に対応しています。
残業時間給の計算も自動的に計算します。
E 給与計算書と明細書との読み書きの位置情報は、すべてシート上の表で管理していますので明細 書の様式を簡単に変更できる様になっています。

【 検索所得税マクロ( 見本 )をダウンロードする 】 ( ダウンロード数: 988 )

A 例 2
表( 下記表 3.3を参考 )から住所をを取得する方法
セル 2,5 に、マクロで、住所を取得したい郵便番号を書込みます。
セル 2,4 に、関数 =MATCH(R[1]C,R[2]C:R[1867]C,0)+3 を書き込む。
+3 は、相対位置をここで、絶対位置にしています。
セル 2,6 に、関数 =ISNA(R[2]C) を書き込む
関数 ISNA は、指定したセルが、「 #N/A 」かチェックする関数です。
該当ないときには、該当なしのメッセージを表示します。
関数 ISNA は、表検索の時は、入れて適切な処理をするようにしてください。

              表 3.3 住 所 一 覧 表

郵便番号から、住所を表検索するマクロを公開しています。
下記からダウンロードしてください。

【 検索住所マクロをダウンロードする 】 ( ダウンロード数: 748 )

4. フォームのテキストボックス・コンボボックスを使う時の注意

マクロでは、フォームを使うのが定番でないかと思いますが、処理の仕方によっては、不測の事態 に、成ることを知っといてください。
ただし、私の様に、module1の先頭で、すべての変数を宣言している場合です。

例 マクロで、ある処理をして、その結果をフォームのテキストボックスやコンボボックスにセット する様な事があった場合。
・フォーム側では、データが、変更された事により、アクションが、発生します。
・この時、フォーム側の処理として、データ変更時に処理をするようにプログラムされていると、 その処理が裏で勝手に実行されます。( イベント発生といいます )
大事なポイントは、変数の使用です。 仮に、メインで処理しているプログラムの変数と フォーム側の処理のプログラムで使用する変数が、同じの時、どうなるかと言うと、変数 の値は、両方のプログラムで、変更されるので、処理がメチャクチャに成ってしまいます。
・つまり、フォームのテキストボックスやコンボボックスにマクロの処理によってデータを セットし、その 結果で、別処理するような場合には、変数の使用には、注意をしてください。
・実際、私が作ったマクロで、上記の事を考慮しないで、プログラミングした処理で、処理の仕 方は合っているのに、ある条件で、答えが合わないというバグ発生し、これを退治するのに多 大の労力を費やしたことがあります。
・要は、簡単な事です。変数の名前を処理毎分けるだけです。
一時的に使用する変数は、作業用変数として作るとプログラムがしやすくなります。


5. 変数の定義 Public と Dim の違い。

変数の定義 PublicDim は、何が違うのでしょうか?

短いプログラムの場合は、いちいち Module を分けて記述をしないと思いますが、長いプログラム の場合、プログラムの整理・わかり易さ等から、複数の Module に分けて記述します。

私のExcelマクロの様に、Module 1 の先頭に全ての変数を、宣言した場合、PublicDim 違い出てきます。

例えば、Public で宣言した変数に、Module 1 内のプログラムで、データを設定した場合、 その設定データは、他の Module へ、受け継がれるので、他の Module でもデータが設定された変数 として使用できますが、 一方 Dimで宣言した変数は、設定値が受け継がれるのは、同一 Module 内だけで、他の Moduleでは、設定データなしの変数になります。

Excelマクロのプログラムを作るときには、PublicDim の使い方を理解して使ってください。


6. 上書き保存してExcelを終了させる方法

マクロで、Excelを上書き保存して、終了させたい時の記述は、次のようにします。

※ module1の先頭で共通に使う変数を宣言しておく。
Public Const AAname As String = "コピー名前変更マクロ.xlsm"
Public Const BBname As String = "表紙"
Public AAA, BBB, CCC As String
Public Fname As String
Public Stn As Integer    
<---- Integer は、整数型 (-32768 〜 32767)

( 省略 )

※ 同時に開いたExcelのブックをアクティブにする箇所で
ブック名をマクロ表紙に保存しておく。
Workbooks(AAname).Sheets(BBname).Cells(1, 1).Value = ActiveWorkbook.Name

※ ユーザーフォーム等から、終了が指示された時に、下記サブルーチンをコールするように プログラムの記述をする。 この時、マクロのブックは、最後に閉じるようにします。

Sub Excel終了処理()
Application.DisplayAlerts = False  
<-- 警告メッセージを停止
On Error Resume Next    
<-- もしもエラーの時、次の行を実行させる

※ マクロ表紙から、ブック名を読みだす。
Fname = Workbooks(AAname).Sheets(BBname).Cells(1, 1).Value
Workbooks(Fname).Save   
<-- Fnameは、同時に開いている

Workbooks(AAname).Save  
<-- AAnameは、Excelのブック名 上書き保存
'Workbooks(AAname).Close  
<-- 保存なしで閉じる時の書き方
                  
Excelのブック名 上書き保存
Application.DisplayAlerts = True  
<-- 警告メッセージを停止解除
Application.Quit          
<-- Excelを終了
End Sub

※ 終了してよいかの確認をさせたい時は、次の2行を( 記述例 )上記に追加します。

Stn = MsgBox("保存して終了していいですか?", vbYesNo, "終了確認")
If Stn = vbNo Then Exit Sub
<-- "NO"のクリック時、
サブルーチンの処理を終了させます。


7. 自分以外の人にマクロを使わせる時の作り方の注意

フォームのボタンをクリックさせる処理等では、一回のクリックだけでは受付しないことが多いの で、マクロの使用者に対して必ず何らかのレスポンスを返してあげる処理を入れてください。
マクロ使用者に対する配慮にもなります。

なぜかというと、ほとんどの使用者は、フォームのボタンをワンクリックしただけで処理されたと 勝手に認識してそのまま次の行為に移ってしまいます。
その結果、未処理のまま、次の処理が実行されマクロが誤動作で暴走する危険もあります。

私の場合、フォームのボタンをクリックしてマクロ側が受け付けた場合、フォームのボタンの表示 を変更するようにしています。
元の表示に戻すタイミングは、その設定による処理が終了した時点でします。

マクロの記述例


 
フォームのボタンをクリックされた時にボタンの表示文字と色を変更する。
( UForm1 は、ユーザーフォームの名前です。 )

Private Sub CommandButton1_Click()
 
( 省略 )
 
UForm1.CommandButton1.Caption = "OK"    
<---- ボタンの表示文字
UForm1.CommandButton1.ForeColor = &HFF0000 
<---- ボタンの文字色 赤
sub end

 
処理を実行後、ボタンの表示文字と色を元に戻す。

Private Sub CommandButton2_Click()
 
( 処理を実行)
 
UForm1.CommandButton1.Caption = "○○○○" 
<---- ボタンの表示文字を元に戻す
UForm1.CommandButton1.ForeColor = &HFF&  
<---- ボタンの文字色 青
sub end

念のため、ユーザーフォームの初期設定でボタンの表示文字と色を設定して置いてください。

Private Sub UserForm_Initialize()
 
( 省略 )
 
UForm1.CommandButton1.Caption = "○○○○"
UForm1.CommandButton1.ForeColor = &HFF&
End Sub


8. 計算式をマクロでセルに書き込む


一般的に計算式のあるExcelのシートにマクロで値を書き込む時には、計算式を事前にExcelのシート に書き込んでおいてすると思います。
しかし、セルの保護は、していない方が多いので式を壊される事が多々あり、計算結果が表示しない トラブルも発生します。 そこで、値を書き込む毎に計算式も書き込むと計算結果が表示しないトラ ブルも発生がなくなるし、計算式のあるセルに保護を掛ける必要もなくなります。
複雑な計算式は、Excelのシート上で「 関数の挿入 」の機能で作成してコピペします。

計算式をマクロで書き込むには、下記の様にします。

=IF(RC[-1]>=60,
"○","×" ) の計算式の記述例は、下記の様になります。
なお、文字列を定義する時には、「"」(ダブルクォーテーション)二個でくくります。
( この計算式は、60 以上は、 「○」 それ以下は、「×」を表示する式です。)

マクロ
ActiveSheet.Cells(セルの縦位置, セルの横位置).Select
ActiveCell.FormulaR1C1 = "=IF(RC[-1]>=60,""○"",""×"")"

※※ 注意 ※※ H29.01.17 追記

下記の様に A1 形式で計算式を文字列合成で作成して書込む時には、Formula を使用して書込みます。

' データの最終位置を抽出しデータの数を計算
Y1 = Range("K1000").End(xlUp).Row - 3 ' データの数を抽出 この時の最終データ位置は、
                    ' 103 でした

' 関数の計算式の作成 Str(Y1)は、先頭にスペースが入るので LTrim でカットする
' ex. =MATCH(N2,K4:K103,FALSE) を作成する
AAA = "=MATCH(N2,K4:K" & LTrim(Str(Y1)) & ",FALSE)"
'
' 所定のセルに関数式を書込み設定
'
ActiveSheet.Cells(2, 11).Formula = AAA


9. [ファイルを開く]ダイアログボックスでネットワークドライブを開く方法

マクロでファイルを開くダイヤログは、例えば

myFname = Application.GetOpenFilename("画像ファイル(*.JPG),*.JPG")

のようにしますが、通常パスは、カレントディレクトリになりますが、任意のパスに変更する時に は、ChDrive (ドライブのパス) と ChDir "フォルダのパス" で指定しなければなりません。
しかし、ネットワークドライブを指定する時には、チョット面倒になります。
その方法は、下記の様にして実現します。

@ Module1 の先頭でネットワークドライブを参照することを下記のよう宣言します。

 Public Const ・・・・・・・
 Public ・・・・・・・
 
Public Declare Function SetCurrentDirectory _
   Lib "kernel32" Alias "SetCurrentDirectoryA" _
     (ByVal lpPathName As String) As Long


2019.06.14 追加 [ Excel 64bit版への対応方法 ]

上記、ブルーのステートメント部分を下記のように変更します。 64bit 版では、32bitのステー
トメントは、赤表示(コンパイルエラー)になりますが動作はします。

 
'----------------------------------------------------------------------------
 ' ネットワークドライブの参照
 ' VBA7という定数を使うとEXCELのバージョンが2007以前か2010以降かが区別できる。
 ' Win64は、実行しているEXCELのバージョンが64bitか32bitかの区別が出来る。

  #If VBA7 And Win64 Then
  '64Bit 版 かつ 2010以降
   Private Declare PtrSafe Function SetCurrentDirectory _
    Lib "kernel32" Alias "SetCurrentDirectoryA" _
    (ByVal lpPathName As String) As Long
  #Else
  '32Bit 版
   Private Declare Function SetCurrentDirectory _
     Lib "kernel32" Alias "SetCurrentDirectoryA" _
     (ByVal lpPathName As String) As Long
  #End If
 '----------------------------------------------------------------------------


A Application.GetOpenFilename を事項する前に、ネットワークドライブのパスを下記の様にして
指定します。

Call SetCurrentDirectory(\\で始まるネットワークドライブのパス)

B ネットワークドライブと PC内のドライブの両方を区別してパスを設定する方法の例です。
( ADir は、オープンするフォルダのパスです。ex. \\Ls-whgl869\写真データ\○○○○)

If Left(ADir, 2) = "\\" Then
  
Call SetCurrentDirectory(ADir)  <---- ネットワークドライブのパス設定
Else
   ChDrive Left(ADir, 2)  
<---- ドライブの変更 ex. \D
   ChDir ADir       
<---- PC内ドライブのパス設定
End If

この方法は、「すぐ使えるフリーのExcel2007・2010対応マクロのダウンロード」の
写真貼付マクロ」で使用しています。


10. 張付けた写真を固定し変更出来ないようにする方法


張付けた写真を固定し変更( サイズ変更・削除等 )出来ないようにするに、写真を張付けたセルに セルロックをかけるだけです。このプログラムは、「 写真張付マクロ 」で使用しています。


下記は、そのプログラム例です。

Hikisu = "B2:Z50"  
<---- 引数 Hikisu にセル範囲を設定する。
Sample Hikisu    
<---- サブルーチン「 Sample 」の呼出し

Sub Sample(Hikisu As Variant)

 Dim Abc As Single
 ' いきなり実行するのではなく、確認をしてから実行します。
 Abc = MsgBox("このページの写真変更禁止を設定します。", vbYesNo, "写真変更禁止確認")
 If Abc = vbNo Then Exit Sub 
<---- Noの時終了

 '--------------------------------------------------------------------

  ActiveSheet.Unprotect   
<---- 一度シート保護を解除します。

  Cells.Select        
<---- シート全体を選択します。
  Selection.Locked = False  
<---- シート全体のセルの保護ロックフラグをOFFする

  ' Hikisu で定義されたセル範囲を保護する。
  Range(Hikisu).Select   
<---- 写真を張付けたセル範囲を選択します。
  Selection.Locked = True 
<---- 選択されたのセルの保護ロックフラグをONする
  ActiveSheet.Protect userinterfaceonly:=True 
<---- マクロからの書換は、可能にする

  Range("A1").Select
  MsgBox ("写真変更禁止完了")  
<---- 終了メッセージ

End Sub


11. セルに設定されている関数を取り除き計算結果だけにする方法


セルに設定されている関数を取り除き計算結果だけにするには、「 動的配列変数 」を使いドラック 範囲を別シートにコピーをします。 下記は、そのプログラムの例です。
このプログラムは、「 シートの操作マクロ 」で使用しています。

---------------------------------------------------------------------------
コピー範囲をドラックさせてから「ドラック範囲コピー」を呼出します。
サブルーチン実行後、計算結果だけの結果は、「元のシート名」+ ( 計算式なし ) のシート名にな ります。


ドラック範囲コピー
<---- サブルーチン「ドラック範囲コピー」の呼出し

「ドラック範囲コピー」サブルーチン

Sub ドラック範囲コピー()
'------------------------------------------------------
' 動的配列変数を使用して作成。
' 動的配列変数とは、実行する毎に配列の数が、変わる変数
'------------------------------------------------------
Dim Takasa() As Variant
<---- 動的配列変数の使用を宣言する。
Dim Haba() As Variant
'
Sname = ActiveSheet.Name ' シート名取得
'
ドラックされた範囲の位置・大きさを取得する。

※ 補足 ※
シート上の使用範囲を自動選択させるには、ここで ActiveSheet.UsedRange.Select
実行します。


With ActiveWindow.RangeSelection
 x1 = .Columns.Column          
<-- 横方向の始点
 x2 = .Columns(.Columns.Count).Column 
<-- 横方向のセル数
 y1 = .Rows.Row             
<-- 縦方向の始点
 y2 = .Rows(.Rows.Count).Row      
<-- 縦方向のセル数
End With

 '-------------------------------------------------------------------------
 ' 動的配列変数の宣言
 '
 ReDim Takasa(y2)  
<-- 動的配列変数の要素数を決める。
 ReDim Haba(x2)
 '------------------------------------------------------------------------
 '
ドラックされた範囲のセルの高さを取得する。
 For N = y1 To y2
  Takasa(N) = Selection.Rows(N).RowHeight
 Next N
 '
ドラックされた範囲のセルの幅を取得する。
 For N = x1 To x2
  Haba(N) = Selection.Columns(N).ColumnWidth
  Next N
 '------------------------------------------------------------------------

 ' 同一ブック内にコピー

 If UForm1.OptionButton1 = True Then
  '
  シート追加 Add_sheet 
<---- 新規シートを追加するサブルーチンへ
  '
  Worksheets(Sname).Activate 
<---- コピー元シート開く
  Selection.Copy       
<---- ドラック範囲をコピーする。
  '
追加シートをオープンする。
  Worksheets(Add_sheet).Activate
 End If

'------------------------------------------------------------------------
Application.ScreenUpdating = False 
<---- 画面更新を停止する。
Cells(y1, x1).Select        
<---- 張付ける始点を指定する。
'------------------------------------------------------------------------
'
セルの値のみ貼付け
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'------------------------------------------------------------------------
'
セルの書式のみ貼付け
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'------------------------------------------------------------------------
' セルの高さを復元
For N = y1 To y2
Rows(N).RowHeight = Takasa(N)  
<---- セルの高さを復元
Next N
' セルの幅を復元
For N = x1 To x2
Columns(N).ColumnWidth = Haba(N)  
<---- セルの幅を復元
Next N
'------------------------------------------------------------------------
' ゼロを表示しない ?         
<---- ゼロを表示しない指定
ActiveWindow.DisplayZeros = False 
<---- ゼロを表示する時には、
                     'コメントアウトします

'------------------------------------------------------------------------
Application.ScreenUpdating = True  
<---- 画面更新を停止を解除する。
Range("A1").Select

End Sub
-----------------------------------------------------------------------------

新規シートをコピー元の後ろへコピーするサブルーチン

Sub シート追加(Add_sheet As Variant)
<---- Add_sheet は、サブルーチンの引数
'-------------------------------------------------------------------------
' Excel 2007/2010 対策
'
ブックの共有解除をしないとシートコピーできない場合があるので処理する。
Application.DisplayAlerts = False
If ActiveWorkbook.MultiUserEditing Then ActiveWorkbook.ExclusiveAccess
Application.DisplayAlerts = True
'------------------------------------------------------------------------
BBB = ActiveSheet.Name
'
新規シート名をコピー元シートの名前+( 計算式なし )にする
AAA = BBB & "(" & "計算式なし" & ")"
'
SS = ActiveSheet.Name
Application.DisplayAlerts = False 
<---- 警告メッセージの表示を停止する。
Sheets.Add            
<---- 新規シートを追加する。
CCC = ActiveSheet.Name
'
CCC:新規シートの名前、SS:追加シートの名前
Sheets(SS).Move After:=Sheets(CCC) 
<---- 新規シートをコピー元シートの後ろへ移動する。
Worksheets(SS).Name = AAA     
<---- シート名を変更する。
'
Application.DisplayAlerts = True 
<---- 警告メッセージの表示を停止を解除する。
'
Add_sheet = ActiveSheet.Name 
<---- 引数( Add_sheet )に追加シート名を設定する。
'
End Sub


12. ブック間でまとめて( 任意の複数セル・結合セルOK )転記するマクロ

セル結合されたセル内にデータがある場合、単独セルへのデータの移動やソート等ができないのでそ れらの禁止事項を解消させるために、ブック A の任意のシートから ブック B の任意のシートへ 縦 範囲の指定のみでで転記・更に元のセル位置戻すマクロを作成しましたので紹介します。

なお、転記するセル位置は、 [ブックの表紙]に事前指定し たセル位置データを元に行います。転記できるセルの最大数は、初期値 11個としています。
転記先でソートなりの加工した後、転記と同様の操作で元に戻す機能も付加させています。

[ 結合セルから、結合セルへの転記 ] ・ [ 結合セルから、単独セルへの転記 ] ・ [ 単独セルから、 結合セルへの転記 ] が、可能、当然、結合セル/単独セルの混在転記でもOKです。

転記マクロのダウンロードは、

【 転記マクロをダウンロードする 】 ( ダウンロード数: 72 )

---------------------------------------------------------------------------------
@ ユーザーフォーム( UForm1 )の機能

操作をする前に、読込むデータの横方向のセル位置と書込み先のセル位置( 横位置 )をマクロの表紙 で指定しておきます。 データの読み書きは、そのセル横位置を元に行います。

ユーザーフォームの表示は、必ず、編集対象ブックのメニューバー [アドイン]をクリックしてから、 左上アドインメニュー (■) をクリックします。

ユーザーフォームは、上段が、一行毎の読み書き・中段が、マウスで指定した縦範囲を読み書き・下 段が、中段と逆のデータの読み書き、抽出したデータを指定したセルの縦位置を先頭行としてすべて 転記の操作をします。

転記先でソートなりの加工して逆操作で元に戻すことができます。

なお、本マクロ使用時は、本マクロを開いてから、編集対象ブックを開いてください。編集対象ブッ クを先に開くと編集対象ブックの Excel のメニューバーに[アドイン]が、表示しなくなります。

〇 転記マクロの解説

マクロの解説を見るには、【 転記マクロの解説 】をクリックしてください。

       ユーザーフォーム( UForm1 )の各ボタンの機能


13. 現場で役立つ完全フリーの土木測量計算プログラムの紹介ロ

このプログラムは、完全フリーで一切のプロテクトはかけていません、どの様に改造してもOKです。
プログラムの全てを公開、及び計算式等を解説書で私が分かる範囲で公開もしています。


私は、現役時代にポケットコンピュータ( シャープ PC-E650 )を使用して、土木公共工事( 道路・河
川 )の現場の管理・測量等をしていました。 今は、リタイアしています。
当時使用していた土木測量計算プログラム(BASIC で作成)を Excel ( 計算式等は、Excelマクロで作 成 )に移植してみましたので紹介します。


この土木測量計算プログラムは、座標値の登録機能を付加していますので、事前に座標値を登録して
おけば、現場で即使用が簡単にでき、更に、入力ミスを排除して使用でき、結果の信頼性も向上でき ます。

計算結果( 座標値 )は、測点名で登録出来るようにしています。測点名での座標値データ検索・設定 機能もあります。

但し、本プログラム( マクロ )は、エラー処理等していませんので不合理な値をセットして計算させ ると当然エラーになりますので注意してください。 エラー時は、プログラムを再起動して使用して ください。


マクロは、すべて公開しています。角度の計算は、一部を除いて ラジアンでしています。ユーザ定義
関数も組み込んでいますので勉強の参考にしてください。

プログラムの解説書( 計算式 )を作成しています。前半 (座標計算)・後半 (土方カーブ等)に分けて
います。 なお、内容は、私自身が勝手に理解して記述していますので専門的見地で見たら矛盾があ る箇所があるかもしれません。
事前にお断りしておきます。


---------------------------------------------------------------------------------
Excel 版の土木測量計算プログラム

土木測量計算プログラムのダウンロードは、

【 ここをクリックしてください。 】 ( ダウンロード数: 222 )

Excel 版は、計算結果( 座標値 )を追加・保存する機能も付加しています。作業前の事前計算・検証 には、便利なアプリです。簡単ですが、解説書もダウンロードできるようにしています。

---------------------------------------------------------------------------------

※ 注意 ※ 解説書には、[ブックの共有]をかけています。解除は、メニューの[校閲]-->[ブックの
共有]-->[編集]の□のチェックを解除して[OK]をクリックしてください。編集可能にな ります。

土木測量プログラムの内容は、下記の通りです。

   1. 既知点からの方位・距離の計算

   2. 既知点からの方位・距離から座標値の計算
   3. 直線の幅員の座標計算>
   4. 単曲線の幅員の座標計算
   5. クロソイド曲線の幅員座標計算
   6. 円の要素計算
   7. クロソイド要素計算
   8. 2点の既知点から、任意位置の機械点座標計算
   9. 土方カーブの計算( 基準円 + 変量 )
  10. クロソイド曲線土方カーブの計算( 基準円 + 変量 )
  11. 縦断曲線計画高の計算
  12. 2点間の距離・交角の計算
  13. 片勾配 ( 直線 ) の計算
  14. 片勾配 ( 緩和曲線 ) の計算

付録 「 ヘロンの公式による面積計算 」を別シートで付けています。

土木測量計算プログラム解説書 前半 (座標計算) のダウンロードは、
            [ここをクリックしてください。]
土木測量計算プログラム解説書 後半 (土方カーブ等)ダウンロードは、
            [ここをクリックしてください。]


---------------------------------------------------------------------------------
Excel を使用しないで土木測量計算ができるアプリを作成してみました。
---------------------------------------------------------------------------------

Webブラウザ上で動作する土木測量計算プログラム その1

タブレット端末での使用を想定して、Webブラウザ上で動作する
「 Web版 土木測量計算プログラム 」を javascripts + HTML で作成しました。
[ Excel 版の土木測量計算プログラム ] の移植版です。


Web版 土木測量計算プログラムの使用は、[ここをクリックしてください。]


Web版 土木測量計算プログラムは、zip ファイルとしてダウンロード可能にしています。

使用方法は、タブレット端末等で下記からダウンロード後解凍し、(解凍後 125KB 程です。) フォルダ名「 Doboku_keisan 」を適当な場所へコピーし、フォルダ内にあるファイル [ index.html ]を適当な webブラウザで開いてください。

但し、タブレット等で使用する時には、HTML 表示アプリ(お勧めは、Local HTML Viewer)を ストアから同時にダウンロードし、そこからファイル [ index.html ]を起動してください。
「 Webブラウザ上で動作する土木測量計算プログラム その1 」のダウンロードは、

【 ここをクリックしてください。 】 ( ダウンロード数: 114 )

この「 Web版 土木測量計算プログラム 」の内容・仕様は、基本的に Excel 版の土木測量プログラ ムと同じにしています。 2019年12月 入力し易いように、表示を改良しました。

---------------------------------------------------------------------------------
Webブラウザ上で動作する土木測量計算プログラム その2

CSVファイルとして作成した測点座標値を登録番号で設定出来るようにした 「 Web版 土木測量計算プログラム 」の改良版を作成してみました。


CSVファイルの作成は、「Excel 版の土木測量計算プログラム」で作成した座標データを上記写真 1
の様に、新規シートの左端のセル(1,1)に貼付けて[ファイルの種類]を[CSV(カンマ区切り)(*.csv)]に して、下記でダウロード解凍保存した同一フォルダ内にファイル名 Zahyou_data.csv で保存します。
なお、CSVファイルの処理ができない web ブラウザもあります。Microsoft Edge, Safari では、動 作を確認しています。

「 Webブラウザ上で動作する土木測量計算プログラム その2 」のダウンロードは、、

【 ここをクリックしてください。 】 ( ダウンロード数: 111 )

     写真 1 CSVファイルの作成      写真 2 測点座標値を登録番号で設定

   

14. Excel VBA の編集画面( VBE ウィンドウ )を元に戻す方法

VBA の編集画面は、一度壊すと手作業で元に戻すことはかなり面倒になってしまいます。それを戻す には、windows の レジストリをいじる必要があります。その方法を下記に紹介します。( Excel2007 からの場合 )

@ 「ファイル名を指定して実行」で regedit.exe と入力して[OK]をクリックする。


A レジストリ エディターが開くので [HEY_CURRENT_USER] --> [Software} --> [Microsoft] --> [VBA] --> [7.0] --> [Common] の順に開きます。

B [Dock] のいうレジストリを探し、右クリックでリネームして終了します。

名前は、Dock_BackUP とかにします。 後は、Excelブックを開いて確認するだけです。

手動で直す方法は、「Excel VBA の編集画面( VBE ウィンドウ )を元に戻す方法」のキーワードで検 索(Google)するとヒットしますので試してみてください。


TOPへ戻る