【Excel】名前の定義削除

名前の定義は有能だと思うのですが、
参考ブックからコピーすると一緒にコピーされ、
収集つかなくなるためこれで削除します。

Option Explicit

Private Sub NameDefDel()
    Dim Ans, RefStyle, n
    
    Ans = MsgBox("実行しますか?", vbYesNo, "実行確認")
    If Ans = vbNo Then Exit Sub
    
    RefStyle = Application.ReferenceStyle
    
    If RefStyle = xlR1C1 Then
        Application.ReferenceStyle = xlA1
    Else
        Application.ReferenceStyle = xlR1C1
    End If

    For Each n In ActiveWorkbook.Names
        If Not n.Name Like "*!Print_Area" And _
            Not n.Name Like "*!Print_Titles" Then
            n.Delete
        End If
    Next

    Application.ReferenceStyle = RefStyle
    
    MsgBox "完了しました!"
End Sub

【Java】例外内容を文字列で取得する

例外内容を文字列で取得します。
例外内容をメール本文等に出力する際に利用します。

/** 
 * 例外内容取得処理
 * @param 例外オブジェクト
 * @return 例外内容文字列
 */
public static String getTrace(Throwable th) {

    StringBuilder sb = new StringBuilder();
    String lineSeparator = System.getProperty("line.separator");

    if (th != null) {
        sb.append(th.getClass().getName() + ":" + th.getMessage());
        StackTraceElement[] stack = th.getStackTrace();
        if (stack != null) {
            for (int i = 0; i < stack.length; i++) {
                sb.append(lineSeparator);
                sb.append("\tat " + stack[i].toString());
            }
        }
        sb.append(lineSeparator);

        Throwable causeTh = th.getCause();
        String caused = getCaused(causeTh);
        sb.append(caused);
    }

    return sb.toString();
}

/** 
 * 例外内容取得処理(原因)
 * @param 例外オブジェクト
 * @return 例外内容文字列
 */
public static String getCaused(Throwable th) {

    StringBuilder sb = new StringBuilder();
    String lineSeparator = System.getProperty("line.separator");
    Throwable chainTh = null;

    if (th != null) {
        sb.append("Caused by: " + th.getClass().getName() + ":" + th.getMessage());
        StackTraceElement[] stack = th.getStackTrace();
        if (stack != null) {
            for (int i = 0; i < stack.length; i++) {
                sb.append(lineSeparator);
                sb.append("\tat " + stack[i].toString());
            }
        }
        sb.append(lineSeparator);

        chainTh = th.getCause();

    } else {
        return sb.toString();
    }

    return sb.append(getCaused(chainTh)).toString();
}

/**
 * テストドライバ
 * @param args
 */
public static void main(String[] args) {

    try {
        test();
    } catch (Throwable th) {
        System.out.println("JavaAPIで例外出力");
        th.printStackTrace();

        System.out.println();
        System.out.println("独自APIで例外出力");
        System.out.println(getTrace(th));
    }
}
public static void test() throws Exception {
    try {
        try {
            int i = 0;
            int j = 100;
            int k = j/i; // ここでエラー発生
        } catch (Exception e) {
            throw new Exception("エラー", e);
        }
    } catch (Exception e) {
        //throw e;
        throw new Exception("エラー2", e);
    }
}

【VisualStudio】他フォームが呼べない場合の対処

外部からインポートしたプロジェクトで
他フォームをShowやShowDialogで開く際、
FileNotFoundが発生している場合、プロジェクトフォルダ内の「App.config」を見直す。

外部ライブラリ等を参照している場合、パスが記載されていることがあり、
そのパスに外部ライブラリがないことで発生している。

【bat】UTF-8のDBデータ取得

バッチファイルでUTF-8のDBデータを取得します。
DBデータ取得部分はDBに併せて変更する。

@echo off
REM バッチ実行ファイルと同階層に実行したいSQLファイルを配置する。
REM SQLファイルは1文を1行で記載する。
REM SQLファイルは「PARAM1」と「PARAM2」を置換文字列としておく。
setlocal ENABLEDELAYEDEXPANSION

REM SQLファイルの置換内容の入力
set /P START_DAY="開始日(YYYYMMDD)を入力してください。:"
set /P END_DAY="終了日(YYYYMMDD)を入力してください。:"

REM バッチ実行ディレクトリの設定
set CURRENT_DIR=%~dp0

REM 日付時刻の設定
set CURRENT_DATE_TIME_HOUR=%time:~0,2%
set CURRENT_DATE_TIME_MINUTE=%time:~3,2%
set CURRENT_DATE_TIME_SECOND=%time:~6,2%
set CURRENT_DATE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%CURRENT_DATE_TIME_HOUR: =0%%CURRENT_DATE_TIME_MINUTE: =0%%CURRENT_DATE_TIME_SECOND: =0%

REM DB接続ファイルのディレクトリに移動
REM 今回の例ではMySQLとする
set MYSQL_DIR="C:\Program Files\MySQL\MySQL Server 5.7\bin"
cd /d %MYSQL_DIR%

set SQL_FILE=%CURRENT_DIR%%~n0.sql
set SQL_FILE_TMP=%CURRENT_DIR%%~n0_tmp.sql
set WORK_DIR="D:\work"
set OUT_DIR=%CURRENT_DIR%output\%CURRENT_DATE_TIME%
mkdir %OUT_DIR%

set ROWNUM=1

REM コンソールの文字コードをUTF-8に変更
chcp 65001

for /f "tokens=*" %%i in (%SQL_FILE%) do (
set SQL_LINE1=%%i
set SQL_LINE2=!SQL_LINE1:PARAM1=%START_DAY%!
set SQL_LINE3=!SQL_LINE2:PARAM2=%END_DAY%!
echo !SQL_LINE3! > %SQL_FILE_TMP%

REM DB接続と実行
REM 今回の例ではMySQLとする
mysql -h localhost -u ユーザID -pパスワード -P ポート番号 docrdb < "%SQL_FILE_TMP%" >> %WORK_DIR%\!ROWNUM!.txt

set /A ROWNUM=!ROWNUM!+1
)

del %SQL_FILE_TMP%

REM コンソールの文字コードをShift-JISに変更
chcp 932

REM DBデータ出力結果のファイル名を変更
move %WORK_DIR%\1.txt %OUT_DIR%\01_案件数.txt
move %WORK_DIR%\2.txt %OUT_DIR%\02_案件数不備あり.txt
move %WORK_DIR%\3.txt %OUT_DIR%\03_案件数不備なし.txt

【bat】バッチファイルのテンプレート

バッチファイルのテンプレートとして、以下を設定する。
日付時刻の設定
バッチファイル実行場所の利用
バッチファイルと同名ファイルの利用

@echo off

REM 日付時刻の設定
set CURRENT_DATE_TIME_HOUR=%time:~0,2%
set CURRENT_DATE_TIME_MINUTE=%time:~3,2%
set CURRENT_DATE_TIME_SECOND=%time:~6,2%
set CURRENT_DATE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%CURRENT_DATE_TIME_HOUR: =0%%CURRENT_DATE_TIME_MINUTE: =0%%CURRENT_DATE_TIME_SECOND: =0%

REM バッチファイル実行場所の利用
REM バッチファイルと同名ファイルの利用
set LOG_FILE=%dp0/%n0_%CURRENT_DATE_TIME%.log

【Java】BATからJava呼び出し

BATファイルからJava処理を呼び出します。

@echo off
REM 空欄を指定した場合、後続処理でバッチ実行ディレクトリになる
set USR_EXEDIR=C:\work\bin

echo START Java呼び出し

if "%USR_EXEDIR%" EQU "" (set USR_EXEDIR=%~dp0)
cd /d %USR_EXEDIR%
if %errorlevel% == 1 goto label_cderror

set LIB_DIR=C:\work\lib
set EXE_PATH=.\sub.jar;..\db\ojdbc7.jar;%LIB_DIR%test.jar
set CONF_DIR=..\conf
set CLASS_PATH=.

set JAVA_OPTION=-Xms128M -Xmx128M -XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
java %JAVA_OPTION% -classpath %EXE_PATH%;%CONF_DIR%;%CLASS_PATH%;jp.co.test.TestMain > nul

echo END Java呼び出し(0)
exit %errorlevel%

:label_cderror
echo END Java呼び出し(9)
exit(9)

【Excel】選択範囲の取消線削除

選択範囲の取消線を削除します。
納品時の作業で利用することあり。

Sub StrikethroughDel()
    For Each myCell In Selection
        textBefore = myCell.Value
        textAfter = ""
        For i = 1 To Len(textBefore)
            If myCell.Characters(Start:=i, Length:=1).Font.Strikethrough = False Then
                textAfter = textAfter & Mid(textBefore, i, 1)
            End If
        Next i
    Next myCell
End Sub

【Excel】画像自動貼り付け

フォルダ内のJPGファイルをフォルダごとのシートを作成し、
そのシート内に自動で貼り付けします。

Sub JpgPut()

' JpgPut
' JPGファイルを貼り付ける。
' エビデンスが存在する1階層上のフォルダを指定する。(末尾\)
' フォルダ内のJPGファイルは100枚まで。
' 例)
' C:\work\ebi\を指定した場合、
' C:\work\ebi\imgフォルダ内のJPGファイルを貼り付ける。

    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = True
    Application.StatusBar = "処理中・・・"
    
    Dim count As Integer
    count = 0
    Dim folderPath As String ' 環境によって変更すること。
    folderPath = Worksheets(1).Cells(2, 1).Value
    
    Dim fileName As String
    fileName = Dir(folderPath & "\", vbDirectory)
    
    Dim n As Integer
    n = 0
    
    Dim fileNames(100) As String
    Do While fileName <> ""
        fileNames(n) = fileName
        n = n + 1
        fileName = Dir()
    Loop
    
    Dim i As Integer
    Dim j As Integer
    For j = 0 To n
        fileName = fileNames(j)
        If GetAttr(folderPath & "\" & fileName) And vbDirectory Then
            If fileName <> "." And fileName <> ".." And fileName <> "" Then
                i = 0
                Dim newSheet As Worksheet
                Set newSheet = Worksheets.Add()
                newSheet.Move after:=Worksheets(Worksheets.count)
                newSheet.Name = fileName
                
                Dim jpgPath As String
                jpgPath = Dir(folderPath & "\" & fileName & "\" & "*.JPG", vbNormal)
                Do While jpgPath <> ""
                
                    ' 画像の高さに合わせて「45」の数値を変更すること。
                    newSheet.Cells(i * 45 + 1, 1).Value = jpgPath
                    newSheet.Cells(i * 45 + 2, 2).Select
                    
                    ' Excel2010の場合はここから
                    ' 画像を1*1ポイントで貼り付け
                    Set myShape = Worksheets(fileName).Shapes.AddPicture( _
                    fileName:=folderPath & "\" & fileName & "\" & jpgPath, _
                    linkToFile:=False, _
                    saveWithdocument:=True, _
                    Left:=Selection.Left, _
                    Top:=Selection.Top, _
                    Width:=msoTrue, _
                    Height:=msoTrue)
                    ' 画像を元のサイズに変換(Heightの設定は不要かも)
                    ' Withを利用しないとオブジェクトエラーになる。
                    With myShape
                        LockAspecRatio = msoTrue
                        Hieght = 560
                    End With
                    'myShape.LockAspecRatio = msoTrue
                    'myShape.Hieght = 560
                    ' Excel2010の場合はここまで
                    
                    ' Excel2013の場合はここから
                    'Worksheets(fileName).Picutures.Insert fileName:=folderPath & "\" & fileName & "\" & jpgPath
                    ' Excel2013の場合はここまで
                    
                    i = i + 1
                    count = count + 1
                    jpgPath = Dir()
                Loop
                
            End If
        End If
    Next j
    
    Application.StatusBar = count & "個貼り付け完了"
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

【Java】フォルダ解凍処理

フォルダ内のファイルを解凍します。

/** 
 * ファイル解凍処理
 */
private void deCompressFile() throws Exception {

  // 圧縮ストリームを宣言する。
  ZipInputStream zis = null;

  try {
    // 作業フォルダのファイルを解凍する。
    zis = ZipInputStream(
      new BufferedInputStream(
        new FileInputStream(this.currentZipFileName)));

    // ファイルのエントリを宣言する。
    ZipEntry entry;
    // ファイルに含まれるエントリ分繰り返す。
    while ((entry = zis.getNextEntry()) != null) {
        // 解凍対象ファイル名を取得する。
        String fileName = entry.getName();
        // ディレクトリの場合
        if (entry.isDirectory()) {
            // ディレクトリを作成する。
            Path filePath = Paths.get(this.currentTmpDir + Const.FILE_PATH_SEPARATOR + fileName);
            Files.createDirectories(filePath);
        // ファイルの場合
        } else {
            // 解凍処理を行う。
            extract(zis, fileName);
        }
    }
  } catch (Exception e) {
    LOGGER.error("エラー発生");
    throw new Exception("エラー発生", e);

  } finally {
    if (zis != null) {
      try {
        zis.close();
      } catch (Exception e) {
        LOGGER.error("エラー発生");
        throw new Exception("エラー発生", e);
      }
    }
  }
}

 * 解凍処理
 * @param zis 圧縮ストリーム
 * @param fileName 解凍対象ファイル名
 */
private void extract(ZipInputStream zis, String fileName) throws Exception {

  // 出力用のストリームを宣言する。
  BufferedOutputStream bos = null;

  try {
    // 解凍対象ファイルのフルパスを取得する。
    Path filePath = Paths.get(this.currentTmpDir + Const.FILE_PATH_SEPARATOR + fileName);

    // 解凍対象ファイルを読み込む。
    int readSize = 0;
    byte[] buffer = new byte[1024];
    bos = new BufferedOutputStream(
        new FileOutputStream(filePath.toString()), 1024);

    // 解凍対象ファイルをファイルとして出力する。
    while ((readSize = zis.read(buffer, 0, buffer.length)) != -1) {
        bos.write(buffer, 0, readSize);
    }
    bos.flush();

  } finally {
    if (bos != null) {
      bos.close();
    }
    zis.closeEntry();
  }
}