ぐ~たら ぷろぐらまー にっき

最近すぐ忘れるけー。

【VBA】Excel出力

マスタのCD分、Excel出力

'//// Excel出力
Public Sub ExcelOut(ByVal pMysql As String, ByVal pFilePath As String)
On Error GoTo ErrHnd
 
    Dim qryName As String
    qryName = "Q_Dummy" 'クエリ名の指定
 
    'エクセル出力用クエリ"qryName"の存在を確認。無い場合は作成
    If DCount("*", "[MsysObjects]", "[Name]='" & qryName & "' And [Type]=5") = 0 Then
        Dim qdf As DAO.QueryDef
        Set qdf = CurrentDb.CreateQueryDef(qryName, pMysql) 'クエリの作成
        qdf.Close: Set qdf = Nothing
    End If
     
    'クエリ内のSQLの書き換え
    CurrentDb.QueryDefs(qryName).SQL = pMysql
    'エクセルに出力
    DoCmd.TransferSpreadsheet acExport, 10, qryName, pFilePath, True, ""
    
    MsgBox "出力しました"
     
Exit Sub
 
ErrHnd:
    Select Case Err.Number
     
        Case 2501 'キャンセル処理
            MsgBox "キャンセルしました"
         
        Case 2302 '書き込みエラー
            MsgBox "ファイルの書き込みに失敗しました。"
             
        Case 3061, 3075, 3078, 3131 'SQL構文エラー
            MsgBox "SQL構文エラーです"
         
        Case Else
            MsgBox "ErrorCode:" & Err.Number & Chr(13) & _
                    "ErrorDescription:" & Err.Description
    End Select
End Sub
Private Sub Exp()

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim strSQL As String
    Dim FilePath As String
    
    FilePath = CreateObject("WScript.shell").specialfolders("Desktop") & "\"
    
    Set DB = CurrentDb
    strSQL = "SELECT * FROM TM_園マスタ;"
    Set RS = DB.OpenRecordset(strSQL)
    
    'レコードの存在チェック
    If RS.BOF = True And RS.EOF = True Then
        GoTo Finally
    End If
    
    Do Until RS.EOF
        Dim strSQLw As String
        Dim FilePathw As String
        Dim NameCD As Integer
        NameCD = RS![園CD]
        strSQLw = "SELECT * FROM T_kojin WHERE [園CD] = " & NameCD & ";"
        FilePathw = FilePath & NameCD & "_" & RS![園名] & ".xlsx"
        Call ExcelOut(strSQL, FilePathw)
        
        RS.MoveNext
    Loop

Finally:
    RS.Close
    DB.Close
    
    Set RS = Nothing
    Set DB = Nothing

End Sub

DataGridViewでEnterキーが押された時に横のセルに移動したい

ちょっと苦手なDataGridViewのメモ

CellEnterイベントとかでEnterキーの時はTabキーを送るようにしていたんだけど
ReadOnlyのセルはとばしたかったり、最終行がReadOnlyだったらとか
制御が面倒になってきて、結局DataGridViewを継承したカスタムコントロールを作るのが一番手っ取り早かったので。

あちこち参考にさせていただき、今はこれに落ち着きました。
今回のバグはこれで何とかなりそう~。たぶん

*******

Enterキーでフォーカス横移動
ReadOnly=Trueのセルは飛ばす
最終列がReadOnlyの場合は次の行へ移動
最終行だった場合は最初の行に戻る

********

'///////////////////
' DataGridView
'///////////////////

''' <summary>
''' DataGridView
''' Enterキーが押された時に、Tabキーが押されたのと同じ動作をする
''' (現在のセルを隣のセルに移動する)
''' ReadOnlyのセルはとばす
''' </summary>
Public Class DataGridViewEx
    Inherits DataGridView

    Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean

        If (keyData And Keys.KeyCode) = Keys.Tab OrElse (keyData And Keys.KeyCode) = Keys.Enter Then

            '現在のセルの次の列
            Dim col As Integer = Me.CurrentCell.ColumnIndex + 1

            While col < Me.Columns.Count

                If Not Me.Rows(Me.CurrentCell.RowIndex).Cells(col).ReadOnly And Me.Rows(Me.CurrentCell.RowIndex).Cells(col).Visible Then
                    Exit While
                End If
                col = col + 1
            End While

            If col < Me.Columns.Count Then
                Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex).Cells(col)

            Else
                '行
                Dim row As Integer = Me.CurrentCell.RowIndex + 1
                Dim Flg As Boolean = False '無限ループ防止フラグ

                If row = Me.Rows.Count Then
                    '最終行の場合は最初の行に戻す
                    row = 0
                    Flg = True
                End If

                While row < Me.Rows.Count
                    For col = 0 To Me.Columns.Count - 1
                        If Not Me.Rows(row).Cells(col).ReadOnly And Me.Rows(row).Cells(col).Visible Then
                            Exit While
                        End If
                    Next

                    If row = Me.Rows.Count - 1 And Flg = False Then
                        '1回だけ最初の行に戻す
                        row = 0
                        Flg = True
                    Else
                        row = row + 1
                    End If
                End While


                If col < Me.Columns.Count Then
                    Me.CurrentCell = Me.Rows(row).Cells(col)
                End If

            End If

            Return True

        End If

        Return MyBase.ProcessDialogKey(keyData)
    End Function

    Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean

        If e.KeyData = Keys.Tab OrElse e.KeyData = Keys.Enter Then

            Dim col As Integer = Me.CurrentCell.ColumnIndex + 1

            While col < Me.Columns.Count
                If Not Me.Rows(Me.CurrentCell.RowIndex).Cells(col).ReadOnly And Me.Rows(Me.CurrentCell.RowIndex).Cells(col).Visible Then
                    Exit While
                End If
                col = col + 1
            End While

            If col < Me.Columns.Count Then

                Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex).Cells(col)
            Else

                '行
                Dim row As Integer = Me.CurrentCell.RowIndex + 1
                Dim Flg As Boolean = False '無限ループ防止フラグ

                If row = Me.Rows.Count Then
                    '最終行の場合は最初の行に戻す
                    row = 0
                    Flg = True
                End If

                While row < Me.Rows.Count

                    For col = 0 To Me.Columns.Count - 1
                        If Not Me.Rows(row).Cells(col).ReadOnly And Me.Rows(row).Cells(col).Visible Then
                            Exit While
                        End If
                    Next

                    If row = Me.Rows.Count - 1 And Flg = False Then
                        '1回だけ最初の行に戻す
                        row = 0
                        Flg = True
                    Else
                        row = row + 1
                    End If
                End While


                If col < Me.Columns.Count Then
                    Me.CurrentCell = Me.Rows(row).Cells(col)
                End If
            End If
            Return True

        End If

        Return MyBase.ProcessDataGridViewKey(e)
    End Function

End Class

<SQLServer>テーブルの保存でエラー

自分メモ

テーブルをちょこっと変更して保存しようとしたらエラー。

変更の保存が許可されていません。

f:id:nekobasu6126:20181001155907p:plain

時々遭遇してたんだけど、調べるの面倒だし時間ないしとか色々あって
テーブルの再作成してごにょごにょしてました。

ちょっと今日はその気になったので調べました。

すぐ出てきました。

https://support.microsoft.com/ja-jp/help/956176/error-message-when-you-try-to-save-a-table-in-sql-server-saving-change

もしかしたらテーブルの再作成するより早かったかもしれない・・・。

「ツール」-「オプション」のデザイナーにある
□テーブルの再作成を必要とする変更を保存できないようにする
のチェック外す。

f:id:nekobasu6126:20181001160340p:plain

<SQLServer>バックアップ

自分めも。

めったにしないもんだから、毎回はまります。

何も考えずバックアップすると怒られます。
なんでかなー。

f:id:nekobasu6126:20181001141751p:plain


「メディアオプション」で「新しいメディアセットにバックアップし、すべての既存のバックアップセットを消去する」
を選択するとできました。

f:id:nekobasu6126:20181001142903p:plain



ここ、参考にさせていただきました。
助かりました。

SQLServer:完全バックアップを別データベースに復元する方法siguniang.wordpress.com

「ファイルを開く」ダイアログボックスの表示

めも

    ''' <summary>
    ''' 「ファイルを開く」ダイアログボックスの表示
    ''' </summary>
    ''' <param name="pFileName">初期表示するファイル名</param>
    ''' <param name="pDirectory">初期表示するディレクトリ</param>
    ''' <param name="pFilter">ファイルのフィルタ</param>
    ''' <param name="pFilterIndex">ファイルの種類 の初期設定</param>
    ''' <param name="pTitle">タイトル</param>
    ''' <param name="pMultiselect">複数のファイルを選択可能にする (初期値 False)</param>
    ''' <returns>ファイルのフルパス</returns>
    Public Function OpenFileName(Optional ByVal pFileName As String = "",
                                 Optional ByVal pDirectory As String = "C:\",
                                 Optional ByVal pFilter As String = "CSVファイル(*.csv)|*.csv;|すべてのファイル(*.*)|*.*",
                                 Optional ByVal pFilterIndex As Integer = 1,
                                 Optional ByVal pTitle As String = "ファイルを選択してください",
                                 Optional ByVal pMultiselect As Boolean = False) As String

        Dim ofd As New OpenFileDialog()

        ofd.FileName = pFileName
        ofd.InitialDirectory = pDirectory
        ofd.Filter = pFilter
        ofd.FilterIndex = pFilterIndex
        ofd.Title = pTitle
        ofd.Multiselect = pMultiselect

        ' ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 False)
        'ofd.RestoreDirectory = True
        ' [ヘルプ] ボタンを表示する (初期値 False)
        'ofd.ShowHelp = True
        ' [読み取り専用] チェックボックスを表示する (初期値 False)
        'ofd.ShowReadOnly = True
        ' [読み取り専用] チェックボックスをオンにする (初期値 False)
        'ofd.ReadOnlyChecked = True
        ' 存在しないファイルを指定した場合は警告を表示する (初期値 True)
        'OpenFileDialog1.CheckFileExists = True
        ' 存在しないパスを指定した場合は警告を表示する (初期値 True)
        'OpenFileDialog1.CheckPathExists = True
        ' 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 True)
        'OpenFileDialog1.AddExtension = True
        ' 有効な Win32 ファイル名だけを受け入れるようにする (初期値 True)
        'OpenFileDialog1.ValidateNames = True

        ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
        If ofd.ShowDialog() = DialogResult.OK Then

            If pMultiselect Then

                '複数選択の場合
                Dim strResult As String = ""
                For Each nFileName As String In ofd.FileNames
                    strResult = strResult & "," & ofd.FileName
                Next nFileName
                OpenFileName = strResult

            Else

                OpenFileName = ofd.FileName

            End If

        Else
            'キャンセルの時
            OpenFileName = ""
        End If

        ofd.Dispose()

    End Function