Josh Life Journey

海外旅ブログ 17ヶ月のラテンアメリカ(旅行中)・その他世界一周に必要な情報まとめ・情シスでの経験・解決法

IT

GM-10 2018/2/2 執筆

プレゼン中のメモ欄の表示方法

ppt1

プレゼンテーションの際のメモ(ノート)を記入して、プレゼンを開始すると。


ppt2 - コピー (2)
PCの画面にプロジェクターに写るプレビューと同じ画面が表示されている。

ppt2 - コピー
この画面が出てほしいのに・・・


そんなプロジェクターにミラーリング(表示画面を複製する)したPCでプレゼンを開始した場合にメモが表示され無い場合、下記の手順で表示されるようになります。

Office2013の場合

「スライドショー」タブ → 「モニター」のグループにある
「発表者ツールを使用する」にチェックを入れる。
ppt

ppt2

デフォルトではチェックが入っているので何かの拍子にチェックを外されてしまったのか?


2017/1/26 執筆

オラクルメモ

私の場合Oracle 11gとOracle 12cの2種類がクライアントのPCにインストールされており、
バージョンによって動かすVBのexeを変更しなければいけませんでした。
VBからバッチ生成→結果取得で分岐の条件にしようと思いましたが、面倒だったので結局レジストリから取得しています

クライアントPCのオラクルのバージョンを取得

以下のコマンドで確認できます。
    sqlplus -version

Oracle version


Oracleのサーバーのバージョンも確認できる (使い道不明)

以下のSQLを発行

    select * from v$version

Oracle version-2


参考にしたサイト
https://oracle.programmer-reference.com/oracle-get-version/


2018/1/17 執筆

SVNのコマンドをバッチで自動起動する

TortoiseSVNをインストールしている端末からバッチを利用して、
SVNファイルのupdate、clean等の処理を自動で行う。

SVNのサーバからソースの実ファイルのバックアップを取る為に、毎朝指定のディレクトリにファイル更新する必要が出てきたので、バッチを作成するまでに悩んだ内容を記載する。

SVNコマンド

まず色々なサイトから確認できたコマンドはこれ
    TortoiseProc.exe /command:update /path:"D:\SVN" /closeonend:1

「TortoiseProc.exe」でSVNのコマンドを動かします。
「/command:****」でコマンドを指定し、その後ろにオプションを指定します。
「/path:****」パスを指定
「/closeonend:1」エラーがなければダイアログを閉じる

上記の場合「D\SVN」フォルダに、更新の処理を実行し、エラーがなければダイアログを閉じる

コマンドの詳細はこのサイトを参考に
https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html

正直これで動くかわからない。
更新は問題なく動くのだが、ダイアログが消えないときがある。
この記事を書いているときに色々試したが元々動かなかったのに動いてしまうw
何なんだこいつ


悩んだ内容
・更新のダイアログが表示され、更新完了後にダイアログが閉じない時が稀にある。
 更新される内容によって閉じたり閉じなかったり?
 動いたなと思ったら数日後ダイアログが上がりっぱなしになり次に実行したバッチがエラーになってたりでよくわからない。


IT 2018/1/12 執筆

VB.NET(6.0からマイグレしたやつ) 
C1FlexGridから既存のExcelを開いてぺっと出力して表示するメモ

開発環境:
Microsoft Visual Studio Professional 2013 Version 12.0.40629.00 Update 5
DLL:
GrapeCityのComponentOne Studio for WinForms
C1.Win.C1FlexGrid.4
C1FlexGrid control for .NET Windows Forms JPN.
ランタイム:v4.0.30319
VS2013

C1FlexGridから既存のExcelに出力する方法①

簡単に説明するとGridのDataSourceから2次元配列に変換して、
Excelの指定の範囲をRenge指定して代入するだけ。

引数1 Gridのインスタンス
引数2 Excelのパス

    Private Function Func_ExcelOut(Grd As C1FlexGrid, ExcelPath As String) Dim dt As DataTable = Grd.DataSource
    'DataTableを二次元配列に格納する Dim data(dt.Rows.Count - 1, dt.Columns.Count - 1) As Object For y As Integer = 0 To dt.Rows.Count - 1 For x As Integer = 0 To dt.Columns.Count - 1 data(y, x) = dt.Rows(y)(x).ToString Next Next Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSheet As Excel.Worksheet Try 'Excelを起動する xlsApp = New Excel.Application xlsBook = xlsApp.Workbooks.Open(ExcelPath, [ReadOnly]:=True) xlsSheet = DirectCast(xlsBook.Worksheets(1), Excel.Worksheet) 'Excelの開始位置 Dim xlsRowS As Integer = 11 Dim xlsColS As Integer = 1 Dim range1 As Excel.Range = xlsSheet.Cells(xlsRowS, xlsColS) Dim range2 As Excel.Range = xlsSheet.Cells(dt.Rows.Count - 1 + xlsRowS, dt.Columns.Count - 1 + xlsColS)
    'データ代入
    xlsSheet.Range(range1, range2).Value = data '表示 xlsApp.Visible = True Catch Finally xlsSheet = Nothing xlsBook = Nothing xlsApp = Nothing End Try End Function

range1に(11:1) = A11
range2に(要素数 + 11 - 1:要素数 + 1 - 1) = 
仮に配列のRow,Col共に要素数を5とすると
5+11-1 = 15
5+1-1 = 5
変換すると = E15

ExcelのRangeに(A11,E15)見たいな形で範囲指定し、2次元配列に変換したデータを全て代入します。

ぶっちゃけこの指定は無くてもいけます。
その内容はこの次に説明します。

画面上にExcelを表示さえるので開放はしていないです。

2017/12/22 執筆

Oracleメモ

OracleにLEFT, RIGHT関数が無い・・・

VBにあるLEFT関数やRIGHT関数(右,左から指定文字数切り取る関数)は
Oracleには存在しないようだ。

なので、SUBSTRでの代替案を解説する。

SUBSTRを使ってLEFT, RIGHT関数のような動きをさせる

◆LEFT代替案

SUBSTR(文字列15)

文字列1文字目から右に5文字切り抜く

実例
    SUBSTR('abcd1234', 1, 5)

    abcd1
ORA-SUBSTR1


◆RIGHT代替案

SUBSTR(文字列-5)

文字列の末尾(右)から5文字目を切り抜く

実例
    SUBSTR('abcd1234', -5) d1234
ORA-SUBSTR2


SUBSTRBの場合は全角2バイトでややこしいので説明は割愛

VBA-1 2017/12/4 執筆

ADOを使用してDBからExcelにデータを引くOracleのADOを使いこなす方法

ADOを使用したデータ取得方法(ざっくり)
    '定義
    Dim adoConn As ADODB.Connection Dim adoRS As ADODB.Recordset

    'Oracle接続
    Set adoConn = New ADODB.Connection
    adoConn.ConnectionString = "DSN=
    ****;UID=****;PWD=****;" adoConn.Open

    Dim mySQL As String mySQL = "
    SELECT ******** "

    'SQL発行
    Set adoRS = New ADODB.Recordset Set adoRS = adoConn.Execute(mySQL)

    'A1にべたっと貼り付ける
    sheet1.Range("A1").CopyFromRecordset adoRS

A1から列と行にデータがあるだけ貼り付ける (この方法では列名は貼り付けられない)
※赤字を適当な分に変更して使用下さい。

実行すると定義エラーになる

ここでよくはまるのが
ソースをコピーし、データ取得マクロ実行しようとすると下記のエラーが表示される。

VBA-1-1
コンパイルエラー:ユーザ定義型は定義されていません。

Dim adoCon As ADODB.Connection
この定義名でエラーになる

エラーの原因は単純で参照が抜けている為。
解決方法は以下。

VBA-1-2
ツール → 参照設定

VBA-1-3
「Microsoft ActiveX Data Objects 2.8 Library」にチェックをいれ参照を追加するだけ。
※2.8の部分はバージョンによって変わる。

EX-1 2017/11/20 執筆

INDIRECT関数を使用して別シートのデータを参照

記述が間違っているのかと若干はまりました。

INDIRECTを使用して別シートのデータを参照する場合の具体的な使い方を説明します。

Ex-1-1

上記3つのシートからINDIRECTを使用してセルを参照します。
SheetNo2のA1には「シート2」
Sheet No3のA1には「シート 3」が入力されています。


Ex-1-2

Aにシート名、BにAのシート名を参照したデータを取得したい場合
    =INDIRECT(A1&"!A1")
    =INDIRECT(A2&"!A1")
↓ 内部的にこのように変換され表示される

=INDIRECT("SheetNO2!A1")
=INDIRECT("Sheet NO3!A1")

Ex-1-3

"Sheet NO3"を参照したINDIRECTがエラーになってしまう。

これはシート名に空白が含まれていることが原因

空白を含むシート名を参照する場合のエラーの回避方法は?

シート名を'シングルコート'で囲む必要がある。
    =INDIRECT("'"&A2&"'!A1")
↓ 内部的にこのように変換され表示される

=INDIRECT("'Sheet NO3'!A1")

Ex-1-4

エラー無く表示できました。

SUMIFなどの関数で合計を出す場合でも使用できる。

W4セルのシート名からD5セルの文字列にマッチする行のデータを合計します。
    =SUMIF(INDIRECT("'"&W$4&"'!$I$5:$N$200"),$D5,INDIRECT("'"&W$4&"'!$N$5:$N$200"))

2017/11/6 執筆

Win10でFastCopyをコマンド実行するとエラーになる Ver3.06

Win7,8,8.1では問題なく動いていたバッチ(コマンド)がWin10で動かなくなった対応メモ
※Exeを起動して手動で実行すると動く

フォルダの構成
D\FastCopyTest
┣01_Document1 バックアップ元フォルダ
┣02_DocBackup バックアップ先フォルダ
┣FastCopy306 FastCopyのExeファイル
┗BackupTest.bat FastCopy用のバッチ

バッチの記述内容
    @ECHO OFF ECHO FastCopyによる同期を開始 pause ECHO 同期開始 %date% %time% path D:\FastCopyTest\FastCopy306 fastcopy.exe /job="backup1" /force_close ECHO 同期完了 %date% %time% pause

Win7,8,8.1の実行結果
fast1

Win10の実行結果
fast2

「異常が発生したため、例外情報を以下に保存しました。・・・・」
ファイルの中身は英数字の羅列なので割愛

fast3
ヘルプには対応していると記載されているが・・・・

解決方法 Ver3.06→3.32更新

Googleで検索したが解決しなかったので、
最新版をダウンロードした。

ダウンロード先
https://ipmsg.org/tools/fastcopy.html
バージョン
Ver3.32 64bit

①ダウンロードしたらファイルを解凍
②Ver3.06のフォルダから設定ファイル「FastCopy2.ini」をVer3.32のフォルダにコピー (設定が全て移行される)
③バッチのファイルパスを変更
④バッチ実行
fast4

何事も無く正常終了
データもコピーされています。


2017/10/20 執筆
動作確認 Win10, 7

Win10の既定のブラウザ 「エッジ」

私の会社でもとうとうWin10に切替える検討に入りました。

Win10では既定のブラウザがエッジになり、
デスクトップに置いたURLのショートカットからではエッジ起動しパッケージが軒並み動かない
バッチ等で既定のブラウザをIEに変更しようとしてもエッジに設定されるようMicrosoftが何かを仕組んでいるようだ。
Sysprepもダメ
※17/12/14追記 一部Sysprep後にカスタマイズするといけるらしい? 手段は不明

数百台のPCを展開する上で1台ずつ設定するのは面倒なので、何か方法が無いか考えた。

IE起動のショートカットにURLの引数を追加

昔eclipceを環境によって2種類起動したい際にexeの後ろに引数を持たせたのを思い出し、IEでも出来るのを確認した。

これにより通常使うブラウザは「エッジ」ですが、ショートカットから各パッケージをIEで起動できます。

以下設定の方法

①IEのショートカット作成

win10IE-1
デスクトップで右クリック→ショートカット

win10IE-2
    C:\Program Files\Internet Explorer\iexplore.exe
上記をコピペ
※Win10も同じパスでした。

win10IE-3
ショートカット名はつけたい名前(パッケージ名など)適当に設定

②ショートカットのプロパティ変更

win10IE-4
出来上がったショートカットを右クリック→プロパティ

win10IE-5
リンク先の「~.exe"」の後に起動したいURLを入力→OK
    "C:\Program Files\Internet Explorer\iexplore.exe" google.com
※サンプルは「google.com」

win10IE-6
作成したショートカットアイコンをダブルクリックするとGoogleが表示されます。

Win10で試験しても同じくエッジが起動ではなくIEで起動してきます。
(既定がエッジでも)

既定のブラウザの設定が省略できました。





17/10/19執筆

Oraleメモ

VBAにて簡単なデータ検索機能を作成していてはまりかけた事象

・機能はA列に製品番号を記入して、
  ボタンを押すとその在庫がB列に表示されるといったもの

【ボタン】
A列 製品番号B列 在庫
AAA0
BBB0
CCC0

・内部的には製品番号をSQLのINに指定しADODB.Connection.Executeで発行し、
  Excelに貼り付けるかなりシンプルなもの。
    Dim myArray() As Variant myArray = sheet1.Range("A2", sheet1.Cells(sheet1.Rows.Count, 1).End(xlUp)).Value

    '配列の縦方向と横方向のセル範囲の変換
    myArray = WorksheetFunction.Transpose(myArray)

    '配列をカンマ区切り文字列に変換 Dim mySQLIN As String mySQLIN = "'" & Join(myArray, "','") & "'"

    '~~~~~~省略~~~~~~~
    mySQL = "WHERE 製品番号 IN (" & mySQLIN & ") "

◆A列に1000件以上の製品番号を入れてボタンを押すと
ORA-1
エラー「ORA-01795: リストに指定できる式の最大数は1000です。」

初めはADODBの問題かと思ったが、ググるとSQLのINと判明。
ORACLEの場合IN句に1000件までの指定しか出来ないようだ。


★回避策
①INに1000件以上入れる場合 ORで区切る・・・・なんとも不細工な策・・・

WHERE 製品番号 IN ('1','2','3'.......'1000') OR 製品番号 IN ('1001','1002'.......)

②EXISTSを指定
 未確認

③複合条件のIN?
 WHERE (製品番号,1) IN ( ('AAA',1), ('BBB',1), ('CCC',1) )
 でいけるっぽい。というかこれでいける。
    '配列をカンマ区切り文字列に変換 Dim mySQLIN As String mySQLIN = "('" & Join(myArray, "',1),('") & "',1)"

    '~~~~~~省略~~~~~~~
    mySQL = "WHERE (製品番号,1) IN (" & mySQLIN & ") "


↑このページのトップヘ