1. まとめトップ

【20160702】忘れがちなVBA 最終行を取得するコード

VBA 最終行を取得するコード。面接就職活動転職プログラマーシステムエンジニアSEPG例文2ch掲示板ブラック会社新卒 履歴書 内定内々定エントリーシートアセマネ証券銀行保険アセットマネジメント東大早稲田慶應MARCH京大インターン

更新日: 2018年08月27日

2 お気に入り 1742 view
お気に入り追加

この記事は私がまとめました

3treeslastさん

VBA 最終行を取得するコードって、

調べりゃわかるけど忘れがちなんですよね。

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column


Dim LastRow as Long

LastRow
= ●.Cells(●.Rows.Count, ▲).End(xlUp).Row


Dim LastColumn as Long

LastColumn
= ●.Cells(■, ●.Columns.Count).End(xlToLeft).Column

※●:シート名、シートオブジェクト名
※▲:最終行を求めたい行数
※■:最終列を求めたい列数

エクセルの1列目にシート名を記載したら、シート名を転記してくれるコードを書いたよ!!しかもハイパーリンクを記載してくれる奴!!

■その他メモ

chatbot

■ChatOps 概念
1. プロジェクトのコミュニケーション手段にチャットツールを導入し、
2. チャットのメンバーにbotを常駐させ、
3. プロジェクトメンバーがbotに対してチャット上で指示を出すと、botが処理を行う

■何ができるか https://www.cresco.co.jp/blog/entry/1384/
アプリケーションのデプロイ作業のような実用的なもの
チャットを常時監視し、ネガティブワードを発見したら、その発言者を慰めてくれるようなエンタメ系
欲しいものが無ければ、自分で作れるような開発キットも公開されています。
①定型業務自動実行:デプロイやサーバーの再起動など業務に関わる操作をチャット上で行うためにボットを活用
②チーム力を向上させるためのボット活用:ボットのスケジューラーで理念を流す
褒めチャンネル:スクの完了を報告すると、ボットが画像付きで褒めてくれるようにしています。
遊び心のある褒めメッセージや、ボット以外に人も混ざって褒めてくれるようにすることで、各担当が細かすぎて報告していなかった貢献なども報告してくれるようになりました。
実はそんな貢献をしていたのか!という部分が可視化されてお互いの信頼が強まった
■Botならではの部分として
楽しい
人間よりも確実に定期ポストを行ってくれる
人にやらされている感が薄まる

■チャット製品という分類
Slack
HipChat
ChatWork
Yammer

■案
Yammerとかで技術情報をbot配信する
pathをいれたら、画面のリンクを表示してくれる

bat作成

http://cmz.wp.xdomain.jp/?p=936
①インテル グラッフィクスの設定(グラフィックス・コントロール・パネル)で【量子化の範囲】を【全範囲】に変更
②リフレッシュレートを 59 → 60 に変更しみたら解消した。何が起こってるのかわからない・・・CTRL+ALT+F12

Androidテスト
http://www.smtphone-test.com/test_point/

GALAXY S III
http://www.galaxymobile.jp/support/skp/faq/1071292/

Nexus7
http://nexus7manual.blog.fc2.com/blog-category-79.html
https://support.google.com/nexus/answer/4457705?hl=ja
https://tomokin-gadget.com/?p=1543


iPhone
http://gigazine.net/news/20160128-how-to-fix-safari-crashing/

net use (共有フォルダへのパス) (PASSWORD) /user:(USERNAME) /Y
robocopy "X" "X" /MIR /R:0 /W:0 /LOG:"C:\tmp\backup.log" /NP /NDL /TEE /XJD /XJF
net use (共有フォルダの場所) /delete

■単項目のチェック方法
エラー確認⇒一律チェックせず
必須チェック(empty/実質上のNULL)
※vbaのnullは明示的に設定しない限り、設定されない

空文字は長さ0の「文字列」「''のこと」
日付/時刻型、数値型、のフィールドには、空文字列 "" は格納できません。
Null を代入するようにしましょう。

VBAでは文字列をUnicode形式で扱います。
そのためLenB関数は、半角/全角にかかわらず、すべての文字を2バイトとして計算したバイト数を返します。

中身がある前提でのチェック
【共通】改行コード削除
【共通】空白削除⇒全角半角ともにtrim関数
【③④】空文字列不許可⇒削除 ※①②は空文字列許容 ③④は空文字列不許可

■型ごとのチェック 有効値チェック
①半角英数チェック CHAR/VARCHAR 正規表現(全角不許可)+桁チェック
②全角チェック NVARCHAR(全角許可)+桁チェックのみ
③数値チェック decimal/int4バイト isnumeric+桁チェック+から文字列
④日付チェック DATE 有効かの確認

■log_backup' により、データベース のトランザクション ログがいっぱいになっています。

https://blogs.msdn.microsoft.com/jpsql/2012/03/29/sql-troubleshooting-1-tips-sql-server-s/

C:\Program Files\Microsoft SQL Server\MSSQL10.<インスタンス名>\MSSQL\LOG


http://www.atmarkit.co.jp/ait/articles/1611/01/news018.html

http://www.atmarkit.co.jp/ait/articles/1611/14/news007.html

select * from sys.databases
select name,log_reuse_wait,log_reuse_wait_desc from sys.databases

dbcc opentran
go

select spid,open_tran,program_name from sys.sysprocesses where spid=


http://d.hatena.ne.jp/matu_tak/20091214/1260703464
トランザクション ログを定期的にバックアップする
復旧モデルを「単純」にする

http://d.hatena.ne.jp/matu_tak/20091218/1261160844

■圧縮
http://ips.nekotype.com/4399/

●カッコ = カッコ内の正規表現で抽出された文字列を、変数や保存領域に「一時保存させる」。
()

マッチしたものとマッチしたものを入れ替えることができたりする

●「小文字のa?zまで」以外の1文字にマッチする
[^a-z]

●「es-sysdom」から改行までの後ろの文字を選択
es-sysdom.*$

●「es-sysdom」を含む先頭-改行までを選択
^.*es-sysdom.*$
.*es-sysdom.*$

※行全体を選択する「^.*$」

●特定の形式の数字を選択したい
例:700000001というID
7.......\d←数字で終わるものに限定
7........

●特定の文字で挟まれるものを選択する
第.章 ⇒
\(.*\) ⇒半角括弧()に囲まれた文字


●タブを選択する
\t

●先頭の文字全てを選択したい
^

●行の末尾(改行)全てを選択したい
$

●特定の文字(XXX)で始まる先頭の文字を選択したい
^XXX

●特定の文字(XXX)で終わる文字を選択したい
XXX$
*$ ⇒末尾の半角スペースを削除

●記号を選択
\W

●記号以外を選択
\w

●大文字で始まり、記号以外の文字が連続する(英語で大文字で始まる単語を選択する)
([A-Z])\w+

●半角数字・半角数字以外
\d
\D

●改行
\r\n

http://blog.livedoor.jp/akf0/archives/51395599.html
WITH [別名] AS

(

SELECT 項目1, 項目2 ...

FROM テーブル名

)

SQLステートメント(SELECT, INSERT, UPDATE, DELETE)



https://blogs.yahoo.co.jp/dk521123/18086535.html


X UPDATE tblName AS t -- ★別名にできない★
SET t.name = 'Mike'
WHERE t.id = 001;
--------
O UPDATE t
SET t.name = 'Mike'
FROM tblName AS t -- ☆FROM句でASで別名にできる☆
WHERE t.id = 001;



http://sql55.com/t-sql/t-sql-update-1.php

UPDATE T
SET [カラム1] = [値1],
[カラム2] = [値1], ...
FROM [テーブル1] AS T
WHERE [条件];

http://www.pasokuma.net/windows/server/sqlserver/sqlserverdml.html
UPDATE A
SET A.FIELD_1 = B.B_FIELD
FROM TEST_TABLE AS A
INNER JOIN TEST_TABLE_B AS B
ON (A.UNIQUE_KEY_1 = B.UNIQUE_KEY_1);


http://blog.livedoor.jp/akf0/archives/51443817.html


UPDATE Employee
SET Employee.Dept_Name = 'サンプル'
WHERE EXISTS(
SELECT Dept.Name
FROM Dept
WHERE Employee.Dept_ID = 30
AND Dept.Dept_ID = Employee.Dept_ID)


http://www.geocities.jp/oraclesqlpuzzle/sqlserver/sqlserver-3-3.html



https://teratail.com/questions/81824
UPDATE TBL1
SET
DEL = 1
WHERE
NOT EXISTS (
SELECT
*
FROM
TBL2
WHERE
TBL1.ID = TBL2.ID
AND TBL1.SEQ = TBL2.SEQ
)


http://pg.4696.info/db/mssql/sqlserver-sql.html


UPDATE 会員マスタ
SET 登録日= BK01.登録日
,住所 = BK01.住所
FROM 会員バックアップ AS BK01
WHERE
BK01.バックアップID = '0000001'
AND BK01.会員NO = 会員マスタ.会員NO

#参考 VBA高速化テクニック

・アクティブ(Activate)とセレクトの違い
https://excel-ubara.com/excelvba1/EXCELVBA327.html

・[Excel][VBA] Selectメソッドは99%不要
http://blog.sbe.tokyo/20141219/158/

・VBAの高速化(Selectでのセル選択を行わない)
https://vbabeginner.net/vbaの高速化(selectでのセル選択を行わない)/

⇒要は操作するBookとSheetを特定する記述をしていれば、Selectは記載しなくてもOK

#Workbook・WorkSheetの指定

階層:Workbooksコレクション > Workbookオブジェクト >Worksheetsコレクション >Worksheetオブジェクト >Rangeオブジェクト

★原則1:上位オブジェクトを指定していない場合は、常にアクティブなオブジェクトを参照する
・Workbookの記述を省略した場合、ActiveWorkbookに対して操作が行われる
・Worksheetの記述を省略した場合、ActiveSheetに対して操作が行われる

WorkbookとWorksheetを指定しないとき、ActiveなWorkbookやWorksheetに対して操作が行われるが、
予期せず、操作対象とは異なるWorkbookやWorksheetがActiveの場合、エラーとなる。⇒★原則2を遵守すること

★原則2:単一のWorkbookしか使わないとしても、上位オブジェクトは基本的には省略しない。指定して記述すること。
上位オブジェクトを略さず指定した場合には、アクティブであるなしにかかわらず、一行で異なるブック、異なるシートの指定したセルにコピーすることが可能。

★原則3:ブックに対して何らかの作業を行うには、ブックは開いておかなければなりません。 https://www.officepro.jp/excelvba/book/index1.html

##複数Workbookを操作する場合
★結論 下記を推奨する
自分(ツール)自身を操作する場合:②(OBJ名指定の場合) or ④Obj変数に格納
自分(ツール)以外を操作する場合:④Obj変数に格納

###自分(ツール)自身を操作する場合
「★原則3」を参照
⇒当然、Workbook(ツール)が開かれていることが前提のため、明示的なWorkbooks.Openの記述がない

<①:Workbookを明示しない場合 AND 他のBookがアクティブになっている場合、エラーになりうる> ※「★原則1参照」
Worksheets("Sheet1").Range("A1").Value ="TKG Oishi"
「インデックスが有効範囲にありません。」
※自Bookがアクティブのときで、Worksheets("Sheet1")が存在する場合は機能する。
他Bookがアクティブのときは、必ずしも、Worksheets("Sheet1")が存在しないので、機能しない。⇒要はBookの特定が必要ということ。

<②:自ブックをアクティブにしてから操作>
ThisWorkbook.Activate 'ThisWorkbook:VBAマクロの記載されているツールのこと
Worksheets("Sheet1").Range("A1").Value ="TKG Oishi"

OR

'自ブックを操作する際は、事前にWorksheetのOBJ名を設定可能(@PropertyWindow)なので下記も可
'例:Worksheets("Sheet1")を事前にInputSheetと命名している場合
ThisWorkbook.Activate
InputSheet.Range("A1").Value ="TKG Oishi"

<③:アクティブにせずとも、Workbook.Worksheetという順に指定すれば特定可能> ※「★原則2参照」
'フル指定
WorkBooks(“ブック名”).WorkSheets(“シート名”).Range(セル番地).Value ="TKG Oishi"
OR
ThisWorkbook.Worksheets("Sheet1").Range("A1").Value ="TKG Oishi"
OR
'With指定
With ThisWorkbook
.Worksheets("Sheet1").Range("A1").Value ="TKG Oishi"
End With

<④:③の記載は冗長⇒アクティブにせずとも、Workbook.WorksheetをObj変数に格納することで常に特定可能>
Dim SH1 As Worksheet
Set SH1 = ThisWorkbook.Worksheets("Sheet1") 'Workbook.Worksheetごと格納する方法
SH1.Range("A1").Value = "TKG Oishi"

※速度的にもメリットがある!
http://officetanaka.net/excel/vba/speed/s4.htm

Public Sub MakeSheet()

★Dim LastRow As Long
★Dim strName As String
★Dim linkpath As String
★Dim sheetlinkpath As String
★Dim wbOutPut As Workbook
★Dim wsList As Worksheet

★LastRow = InputSheet.Cells(InputSheet.Rows.Count, 1).End(xlUp).Row

★Dim SheetNameArray() As String
★ReDim SheetNameArray(2)

★'入力したシート名の取得
★For i = 2 To LastRow
★★SheetNameArray(i) = InputSheet.Cells(i, 1)
★★ReDim Preserve SheetNameArray(i + 1)
★Next

★Application.ScreenUpdating = False
★Workbooks.Add '新しいワークブックを開く
★strName = ActiveWorkbook.Name 'ワークブック名をstrNameへ保存する

★'■一覧シート作成
★Set wbOutPut = ActiveWorkbook
★wbOutPut.Worksheets.Add
★ActiveSheet.Name = "一覧"
★Set wsList = wbOutPut.Sheets("一覧")

★'シートを作成し、シート名とハイパーリンクを設定する
★For j = 2 To LastRow

★★'■シート追加+シート命名
★★wbOutPut.Worksheets.Add after:=wbOutPut.Worksheets(Worksheets.Count)
★★ActiveSheet.Name = SheetNameArray(j)
★★
★★'■ハイパーリンク定義
★★listlinkpath = "#一覧!A" & j
★★sheetlinkpath = "#'" & SheetNameArray(j) & "'!A1"
★★

1