3.Excel 操作ワンポイントテクニック集その2(09_Xls_03) (旧、SampleNo.460) |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 / Excel 2013 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :Microsoft.Office.Interop / System.Runtime.InteropServices 参照設定:Microsoft Excel 15.0 Object Library / WaitTime.dll 参照設定方法参照 使用コン:Button21 〜 Button39 TextBox1 TextBox2 BackgroundWorker1 BackgroundWorker2 トロール: このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.Excel の指定列のデータから重複しないデータを抽出 |
'追加 Private title As String Private sleepTime As Integer Private Sub Button21_Click(sender As Object, e As EventArgs) Handles Button21.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '================ 指定列のデータから重複しないデータを抽出 =================== '仮データの書込み Dim Dat(9, 0) As Object Dat(0, 0) = "品 名" : Dat(1, 0) = "みかん" : Dat(2, 0) = "トマト" Dat(3, 0) = "いちご" : Dat(4, 0) = "みかん" : Dat(5, 0) = "トマト" Dat(6, 0) = "いちご" : Dat(7, 0) = "みかん" : Dat(8, 0) = "トマト" Dat(9, 0) = "いちご" Dim xlRange As Excel.Range xlRange = xlSheet.Range("B2:B11") xlRange.Value = Dat MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '-------------------------------------------------------------------------- 'B列のデータリストからオートフィルターを使って重複したものを除いたリストだけを抽出 xlRange = xlSheet.Range("B2:B11") Dim xlRange1 As Excel.Range xlRange1 = xlSheet.Range("B2") xlRange.AdvancedFilter(Excel.XlFilterAction.xlFilterInPlace, xlRange1, , True) MRComObject(xlRange) '抽出したデータ件数を取得 xlRange = xlSheet.Range("B2") Dim xlEndRange As Excel.Range xlEndRange = xlRange1.End(Excel.XlDirection.xlDown) Dim Count, i As Integer Count = xlEndRange.Row MRComObject(xlEndRange) MRComObject(xlRange1) MRComObject(xlRange) ListBox1.Items.Clear() For i = 3 To Count xlRange = xlSheet.Range(R1ToA1(i, 2)) If CInt(xlRange.RowHeight) > 0 Then '抽出したデータを取得 ListBox1.Items.Add(xlRange.Value.ToString) End If MRComObject(xlRange) Next i '確認のために、3秒間表示しておく WT.WaitTime(3000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
2.選択範囲内で指定文字を連続検索 |
Private Sub Button22_Click(sender As Object, e As EventArgs) Handles Button22.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '====================== 選択範囲内で指定文字を連続検索 ======================= '仮データの入力 Dim xlRange As Excel.Range = Nothing Dim retValue As Double = 0 '範囲を変えて試して見て下さい。(セル C3 を含む範囲内で) For c As Integer = 1 To 5 For r As Integer = 1 To 6 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) retValue += 1 Dim s1 As String = CStr(ChrW(65 + r + c)) & CStr(ChrW(70 + r + c)) xlRange.Value = s1 & " " & Str(retValue) & " " & s1 MRComObject(xlRange) Next r Next c xlRange = xlSheet.Range("C3") xlRange.Activate() '指定のセル位置を含む空白行と空白列に囲まれた最小のセル範囲を取得 Dim xlCurrentRegion As Excel.Range xlCurrentRegion = xlRange.CurrentRegion xlCurrentRegion.Select() 'セル領域のアドレス(A1:E6)を取得しR1C1 形式のアドレス(1,1,6,5)に変換 'A1ToR1C1 関数の実使用例 Dim r1c1() As Integer = A1ToR1C1(xlCurrentRegion.Address( _ False, False, Excel.XlReferenceStyle.xlA1)) MRComObject(xlCurrentRegion) MRComObject(xlRange) '範囲の開始位置を整数で求める A1 → 1,1 Dim r1 As Integer = r1c1(0) '1 行 Dim C1 As Integer = r1c1(1) '1 列 '範囲の終了位置を整数で求める E6 → 6,5 Dim r2 As Integer = r1c1(2) '6 行 Dim C2 As Integer = r1c1(3) '5 列 Dim nCount As Integer = 0 Dim N As Integer = 0 Dim target As String = "GL" Dim xlCharacters As Excel.Characters = Nothing For c As Integer = C1 To C2 'C1 列 〜 C2 列までを調べる For r As Integer = r1 To r2 'R1 行 〜 R2 行までを調べる xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) Dim myText As String = xlRange.Value.ToString() '該当セル内で見つかったら、セル内に複数存在するか調べる N = InStr(1, myText, target) While N <> 0 '見つかった文字列の位置 xlCharacters = xlRange.Characters(Start:=N, Length:=target.Length) '見つかった文字列を赤色で太字で表示 Dim xlFont As Excel.Font xlFont = xlCharacters.Font With xlFont .Color = Color.Red .Bold = True End With MRComObject(xlFont) MRComObject(xlCharacters) nCount += 1 '見つかった文字列の個数をカウント '見つかった位置から再度検索を繰り返す。 N = InStr(N + 1, myText, target) End While MRComObject(xlRange) Next r Next c MessageBox.Show(Me, "[" & target & "]は、" & nCount.ToString() & " 回見つかりました。") '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
3.VB2013 から Excel の並べ替え(ソート)を実行する |
Private Sub Button23_Click(sender As Object, e As EventArgs) Handles Button23.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '============================= 並べ替え(ソート) ============================== '何も記入していないと解らないので仮データを記入(R1ToA1 関数の使用例もかねて) Dim xlRange As Excel.Range = Nothing Dim nRnd As New System.Random() For c As Integer = 1 To 10 For r As Integer = 1 To 20 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) '1 〜 100 までのランダムなデータを作成 xlRange.Value = nRnd.Next(1, 100) ' CInt(100 * Rnd()) MRComObject(xlRange) Next r Next c '確認のために、1秒間表示しておく ' WT.WaitTime(1000) MessageBox.Show(Me, "セル範囲 A1:J20 を B 列をキー(列単位)に降順の並べ替え") '--------------------------------------------------------- 'Range オブジェクトの Sort メソッド を使っての並べ替え '-------------------------------------------------------------------------- Dim xlRange1 As Excel.Range xlRange1 = xlSheet.Range("B1") xlRange = xlSheet.Range("A1:J20") 'セル範囲 "A1:J20" を B 列をキー(列単位)に降順の並べ替え xlRange.Sort(Key1:=xlRange1, Order1:=Excel.XlSortOrder.xlDescending, _ Orientation:=Excel.XlSortOrientation.xlSortColumns) MRComObject(xlRange1) MRComObject(xlRange) MessageBox.Show(Me, "次に、セル範囲 A1:J20 を A 列をキー(列単位)に昇順に並べ替えます。") '-------------------------------------------------------------------------- ' Excel 2007 〜 の Sort オブジェクト を使っての並べ替え ' --------------------- マクロの記録を取った場合 --------------------------- ' ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ' ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B1:B20") _ ' , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal ' With ActiveWorkbook.Worksheets("Sheet1").Sort ' .SetRange Range("A1:J20") ' .Header = xlGuess ' .MatchCase = False ' .Orientation = xlTopToBottom ' .SortMethod = xlPinYin ' .Apply ' End With '-------------------------------------------------------------------------- xlRange1 = xlSheet.Range("A1") xlRange = xlSheet.Range("A1:J20") Dim xlSort As Excel.Sort Dim xlSortFields As Excel.SortFields xlSort = xlSheet.Sort xlSortFields = xlSort.SortFields Dim xlSortFields1 As Excel.SortField = Nothing With xlSortFields .Clear() 'SortFields オブジェクトをすべてクリアします '新しい並べ替えの条件を作成 'Key:並べ替える基準のセル SortOn:並べ替えの基準(値・セルの色等) 'Order: 並べ替えの順序(昇順・降順) CustomOrder:ユーザー定義の並べ替えの順序 'DataOption:数値とテキストの並べ替えの選択 'B 列を基準に、値 を基準に、昇順で、テキストを数値データとして並べ替えます。 'SortFields.Add メソッド は、新しい並べ替えフィールドを作成し、SortFields オブジェクトを返すので '変数に受けて解放してやらないとプロセスが終了しません。(ただ、このような使い方が正しいのかは、疑問) xlSortFields1 = .Add(Key:=xlRange1, SortOn:=Excel.XlSortOn.xlSortOnValues, _ Order:=Excel.XlSortOrder.xlAscending, _ DataOption:=Excel.XlSortDataOption.xlSortTextAsNumbers) 'Sort オブジェクトの開始位置と終了位置を設定します xlSort.SetRange(xlRange) '最初の行にヘッダー情報が含まれるかどうかを指定します xlSort.Header = Excel.XlYesNoGuess.xlNo '範囲全体が並べ替えの対象になります。 '大文字と小文字を区別して検索するには、True に設定します xlSort.MatchCase = False '並べ替え方向を指定します xlSort.Orientation = Excel.XlSortOrientation.xlSortColumns '列単位で並べ替え '中国語の並べ替え方法を指定します xlSort.SortMethod = Excel.XlSortMethod.xlPinYin '中国語の発音表記の順で並べ替え 'コピーした並べ替え書式を適用します。 xlSort.Apply() End With MRComObject(xlRange) MRComObject(xlSortFields1) MRComObject(xlSortFields) MRComObject(xlSort) MRComObject(xlRange1) '確認のために、3秒間表示しておく WT.WaitTime(3000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
4.VB2013 から Excel のシートの指定の範囲のデータを取得 |
Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '===================== シートの指定の範囲のデータを取得 ====================== TextBox1.Text = "" ListBox1.Items.Clear() '仮データの入力 Dim xlRange As Excel.Range = Nothing For r As Integer = 1 To 20 For c As Integer = 1 To 10 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) xlRange.Value = Str(r) & "," & Str(c) MRComObject(xlRange) Next Next 'データを取得したい範囲を設定 xlRange = xlSheet.Range("B3:D10") 'クリップボードにコピーする場合 xlRange.Copy() 'Count プロパティでセルの個数を取得 Dim xlCells As Excel.Range xlCells = xlRange.Cells Dim n As Integer = xlCells.Count MRComObject(xlCells) Dim dat(n - 1) As String Dim no As Integer = -1 Dim xlElement As Excel.Range = Nothing For Each xlElement In xlRange no += 1 '指定範囲内のセルの値を1次元配列に確保 dat(no) = xlElement.Value.ToString() MRComObject(xlElement) Next MRComObject(xlRange) '取得したデータを表示 'VB のリストボックスに表示する場合 ListBox1.Items.AddRange(dat) 'Debug.Print で表示 For i As Integer = 0 To n - 1 Debug.Print(dat(i)) Next 'VB のテキストボックスに表示 Dim iData As IDataObject = Clipboard.GetDataObject() 'クリップボードにテキストデータがあれば If iData.GetDataPresent(DataFormats.Text) Then TextBox1.Text = DirectCast(iData.GetData(DataFormats.UnicodeText), String) End If '確認のために、3秒間表示しておく WT.WaitTime(3000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
5.VB2013 から Excel の既存のファイルを印刷 |
Private Sub Button25_Click(sender As Object, e As EventArgs) Handles Button25.Click 'テスト用の適当なファイルを用意しておいて下さい。 '既存のファイルをオープンして、Excel を起動 Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xlsx"), "Sheet1") '============================================================================= '========================== 既存のファイルを印刷 ============================= '[ページ設定]ダイアログボックスを表示(参考) 'xlApp.Dialogs(Excel.XlBuiltInDialog.xlDialogPageSetup).Show() '印刷プレビューを表示(参考までに) 'xlSheet.PrintPreview() 'シートの印刷設定 Dim xlPageSetup As Excel.PageSetup xlPageSetup = xlSheet.PageSetup With xlPageSetup .PaperSize = Excel.XlPaperSize.xlPaperA4 '用紙サイズをA4 '印刷の向き 横=xlLandscape 縦 = xlPortrait .Orientation = Excel.XlPageOrientation.xlPortrait '各余白をセンチ(Cm)単位で設 ' ↓Application でも参照できるが解放されない .LeftMargin = xlApp.CentimetersToPoints(2) '左余白を 20 mm に設定 .RightMargin = xlApp.CentimetersToPoints(2) '右余白を 20 mm に設定 .TopMargin = xlApp.CentimetersToPoints(2.5) '上余白を 25 mm に設定 .BottomMargin = xlApp.CentimetersToPoints(2.5) '上余白を 25 mm に設定 .HeaderMargin = xlApp.CentimetersToPoints(1) 'ヘッダーの余白を 10 mm に設定 .FooterMargin = xlApp.CentimetersToPoints(1) 'フッターの余白を 10 mm に設定 End With 'シートを印刷 2部印刷 'PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, _ ' Collate, PrToFileName, IgnorePrintAreas) 'PrintOut と同様 Excel 2007 の VBA のヘルプでは見当たらないので、MSDN で調べて下さい。 xlSheet.PrintOutEx(, , 2) MRComObject(xlPageSetup) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(3000) Call ProcessCheck() End Sub |
6.VB2013 から Excel のシートの指定範囲を印刷する |
Private Sub Button26_Click(sender As Object, e As EventArgs) Handles Button26.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '=========================== 指定範囲を印刷する ============================== '仮データの入力 Dim xlRange As Excel.Range = Nothing For r As Integer = 1 To 80 For c As Integer = 1 To 15 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) xlRange.Value = Str(r) & "," & Str(c) MRComObject(xlRange) Next Next '指定範囲を格子で罫線を引く(指定範囲を印刷する事とは関係ありません) Call SetLine(1, 1, 40, 8, Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, 0) '確認のために、2秒間表示しておく WT.WaitTime(2000) Dim xlPageSetup As Excel.PageSetup xlPageSetup = xlSheet.PageSetup xlPageSetup.PrintArea = "A1:H40" xlSheet.PrintOutEx() '確認のために、1秒間表示しておく WT.WaitTime(1000) MRComObject(xlPageSetup) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
7.VB2013 から Excel の印刷プレビューの画面を閉じる |
Private Sub Button27_Click(sender As Object, e As EventArgs) Handles Button27.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '======================= 印刷プレビューの画面を閉じる ======================== '仮データの入力 Dim xlRange As Excel.Range = Nothing For r As Integer = 1 To 80 For c As Integer = 1 To 15 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) xlRange.Value = Str(r) & "," & Str(c) MRComObject(xlRange) Next Next '-------------------------------------------------------------------------- '現在表示している Excel のタイトルを取得する title = xlApp.Caption sleepTime = 3000 '指定ミリ秒後に BackgroundWorker を実行する 'バックグラウンド操作の実行を開始 '指定時間後に別スレッドから印刷プレビューの画面を閉じる Me.BackgroundWorker1.RunWorkerAsync() '印刷プレビューを表示する xlSheet.PrintPreview() '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub '別途、ツールボックスから BackgroundWorker1 を貼り付けておいて下さい。 Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As _ System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork '指定時間操作の開始を待つ WT.WaitTime(sleepTime) Dim hwnd As IntPtr 'タイトル名を指定して Excel のウィンドウハンドルを取得 hwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, title) 'AppActivate(title) '前面に表示するでもいいが、後の事も考えて '現在使用している Excel をアクティブにする SetForegroundWindow(hwnd) 'Excel に Excel のショートカットキーを送る '簡便的に SendKeys を使って 'SendKeys.SendWait("{ESC}") 'できれば、下記の SendInput 関数を使った方法でキーを送信して下さい。 ' http://hanatyan.sakura.ne.jp/patio/read.cgi?no=245 Dim ki As New SendInput2013.Class1 ki.KeyReSet() 'キー操作の初期化 '閉じる場合(ESC キーを押す 又は、Ctr + C でも同じ) ki.KeyDown(Keys.Escape) 'ESC キーを押す ki.KeyUP(Keys.Escape) 'ESC キーを放す ki.KeyStroke() '上記一連のキー操作を実行 End Sub #Region "Win32 API 関数の宣言及び変数の宣言" ''' <summary> ''' 指定のウィンドウをZオーダーのトップ位置に移動しアクティブにする(P99) ''' </summary> ''' <param name="hWnd">フォアグラウンドにするウィンドウのハンドルを指定</param> ''' <returns>正常終了の場合=0 以外 エラーの時= 0</returns> <DllImport("USER32.DLL", CharSet:=CharSet.Auto)> _ Private Shared Function SetForegroundWindow( _ ByVal hWnd As IntPtr) As IntPtr End Function ''' <summary> ''' クラス名又はキャプションタイトルを与えてウィンドウのハンドルを取得 ''' </summary> ''' <param name="hWnd1"> ''' 検索する子ウィンドウの親ウィンドウのハンドルを指定、 ''' NULLを指定すると、デスクトップウィンドウが親ウィンドウとして使われ ''' デスクトップの子ウィンドウが探されます ''' </param> ''' <param name="hWnd2">子ウィンドウのハンドルを指定</param> ''' <param name="lpsz1">クラス名又は、クラス名を指定するグローバルアトム</param> ''' <param name="lpsz2">ウィンドウのタイトルでNULLを指定するとクラス名のみで検索する</param> ''' <returns>関数が成功すると、指定したクラスとウィンドウ名を持つウィンドウのハンドルが返り ''' 関数が失敗すると、NULL が返ります</returns> <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ Private Shared Function FindWindowEx( _ ByVal hWnd1 As IntPtr, _ ByVal hWnd2 As IntPtr, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As IntPtr End Function <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ Private Shared Function MoveWindow( _ ByVal hwnd As IntPtr, _ ByVal x As Integer, _ ByVal y As Integer, _ ByVal nWidth As Integer, _ ByVal nHeight As Integer, _ ByVal bRepaint As Boolean) As Integer End Function #End Region |
8.Excel 2013 で印刷中のダイアログを非表示にして印刷(テスト版) |
Private Sub Button28_Click(sender As Object, e As EventArgs) Handles Button28.Click 'テスト用の適当なファイル(印刷に時間がかかるような)を用意しておいて下さい。 '既存のファイルをオープンして、Excel を起動 Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xlsx"), "Sheet1") '============================================================================= '===================== 印刷中のダイアログを非表示に設定 ====================== '表示状態でも、非表示でも同じです。 xlApp.Visible = False '確認のために、2秒間表示しておく 'WT.WaitTime(2000) 'バックグラウンドで、印刷中のダイアログが表示されたら閉じる Me.BackgroundWorker2.RunWorkerAsync() '印刷開始 100 部(プリンターの電源を切ってから試すと用紙が無駄になりません。) xlSheet.PrintOutEx(, , 20) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub '別途、ツールボックスから BackgroundWorker2 を貼り付けておいて下さい。 Private Sub BackgroundWorker2_DoWork(ByVal sender As Object, ByVal e As _ System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork Dim counter As Integer = 0 Dim wid As Integer = Screen.PrimaryScreen.Bounds.Width \ 2 Dim hei As Integer = Screen.PrimaryScreen.Bounds.Height \ 2 Do While counter < 50 '指定の回数繰り返したら終了 '画面の中心(ダイアログが表示される位置)にカーソルを移動する。 '(ダイアログがカーソルの裏になって再描画されなくなる) Cursor.Position = New Point(wid, hei) '印刷中のダイアログのハンドルを取得 Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, "印刷中") If hwnd <> IntPtr.Zero Then MoveWindow(hwnd, 0, 0, 0, 0, False) Exit Do End If WT.WaitTime(10) counter += 1 Loop End Sub |
9.Excel 2013 で行列を入れ替え及び型式を指定して保存 |
Private Sub Button29_Click(sender As Object, e As EventArgs) Handles Button29.Click '既存のファイルをオープンして、Excel を起動 Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\dbtest.xlsx"), "Sheet1") '============================================================================= '================== 行列を入れ替え及び型式を指定して保存 ===================== Dim xlRange As Excel.Range Dim xlSheet2 As Excel.Worksheet = DirectCast(xlSheets.Item(2), Excel.Worksheet) xlRange = xlSheet.Range("A1") xlRange.Activate() Dim xlCurrentRegion As Excel.Range xlCurrentRegion = xlRange.CurrentRegion 'セル A1 を含むデータ入力範囲をコピー xlCurrentRegion.Copy() MRComObject(xlCurrentRegion) '確認のために、1秒間表示しておく WT.WaitTime(1000) 'コピーしたデータを Sheet2 のセル A1 に行列を入れ替えて貼り付け xlSheet2.Select() Dim xlRange2 As Excel.Range xlRange2 = xlSheet2.Range("A1") xlRange2.Select() 'Range(データ) をクリップボードから指定範囲に貼り付けます。 xlRange2.PasteSpecial(Paste:=Excel.XlPasteType.xlPasteAll, _ Operation:=Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _ SkipBlanks:=False, Transpose:=True) xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定 ' xls 形式で名前をつけて保存(Excel 97〜2003 ブック形式) xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xls"), _ FileFormat:=Excel.XlFileFormat.xlExcel8) ' xlsx 形式で名前をつけて保存(Excel 2007〜ブック形式) xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xlsx"), _ FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook) ' xlsm 形式で名前をつけて保存(Excel 2007〜マクロ有効ブック形式) xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.xlsm"), _ FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled) ' csv 形式で名前をつけて保存(CSV (カンマ区切り) 形式) xlBook.SaveAs(Filename:=IO.Path.GetFullPath(".\Test.csv"), _ FileFormat:=Excel.XlFileFormat.xlCSV) MRComObject(xlRange) MRComObject(xlRange2) MRComObject(xlSheet2) '確認のために、2秒間表示しておく WT.WaitTime(2000) '上記保存処理は、下記でファイル名を指定するだけで保存できます。 '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xls"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
10.VB2013 から Excel のセルに関する操作、1行 Tips 集その1 |
Private Sub Button30_Click(sender As Object, e As EventArgs) Handles Button30.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '====================== セルに関する操作1行Tips集その1 ===================== '1.単一セルを参照する場合 'Worksheets("Sheet1").Range("A1").Value = 3.14159 'VBA の表記 'xlSheet.Range("A1").Value = 3.14159 'VB6.0 用の表記(.NET 系では、使用しない事) '上記のコードだけなら.NET系でも解放はされますが、色々参照している内に '解放されない等トラブルを防ぐ意味でも下記のように一度、変数に受けて下さい。 Dim xlRange As Excel.Range = xlSheet.Range("A1") '.NET 系の表記 xlRange.Value2 = 3.14159 MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '2.離れた単一セルを参照する場合 xlRange = xlSheet.Range("A3,D1,C2") xlRange.Value = 12345 MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '3.セル範囲を参照する場合その1 xlRange = xlSheet.Range("A1:C3") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '下記でも同じ事です。 xlRange = xlSheet.Range("A1", "D4") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '4.離れたセル範囲を参照する場合その2 xlRange = xlSheet.Range("A1:C3,A6:C9,E1:H4") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '5.1列全体を参照する場合 xlRange = xlSheet.Range("C:C") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '6.複数列全体を参照する場合 xlRange = xlSheet.Range("C:D, F:F, H:H") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '7.1行全体を参照する場合 xlRange = xlSheet.Range("2:2") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '8.複数行全体を参照する場合 xlRange = xlSheet.Range("4:6, 9:10, 12:12") xlRange.Select() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '9.Worksheet.Cells プロパティを使って全セルを参照する Dim xlCells As Excel.Range = xlSheet.Cells xlCells.Select() MRComObject(xlCells) '10.Range.Cells プロパティを使ってセルを参照する 'Cells プロパティは、セルの指定方法が、Cells(行番号,列番号)のようになり、C5 等の通常の '指定方法と行と列の順序が逆になりますので注意して下さい。 'シート 1 のセル範囲 A1:C5 のフォントスタイルを斜体に設定する VBA の使用例 'Worksheets("Sheet1").Activate() 'Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True '------------------------------------------------------------------------------- '上記操作をVB2010用に書き換えると '上記は、下記のようにした方が無難です。 Dim xlRange1 As Excel.Range = xlSheet.Range(R1ToA1(1, 1) & ":" & R1ToA1(5, 3)) 'のようにして、Cellsプロパティを使わないようにして見て下さい。 'xlRange1.Font.Italic = True のような使い方は、しない事 Dim xlFont As Excel.Font = xlRange1.Font xlFont.Italic = True MRComObject(xlFont) MRComObject(xlRange1) '確認のために、1秒間表示しておく WT.WaitTime(1000) '11.セルに値を設定する 'Value プロパティとValue2 プロパティの違いは、通貨型及び日付型のデータを使用しない事です xlRange = xlSheet.Range("A1") xlRange.Value = System.DateTime.Now Dim xlOffsetRange As Excel.Range xlOffsetRange = xlRange.Offset(1) xlOffsetRange.Value2 = System.DateTime.Now MRComObject(xlOffsetRange) MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '12.セルの値を取得する xlRange = xlSheet.Range("A1") Debug.Print(xlRange.Value.ToString) '2012/05/11 11:50:07 xlOffsetRange = xlRange.Offset(1) xlOffsetRange.NumberFormatLocal = "yyyy/mm/dd hh:MM:ss" Debug.Print(xlOffsetRange.Value2.ToString) '41040.4931328588 Debug.Print(xlOffsetRange.Value.ToString) '2012/05/11 11:50:06 '確認のために、1秒間表示しておく WT.WaitTime(1000) MRComObject(xlOffsetRange) MRComObject(xlRange) '13.セルに数式を設定する 'Range.Formula プロパティは、数式を、A1 参照形式で、取得、又は設定します。 xlRange = xlSheet.Range("C1") xlRange.Value = 123 xlOffsetRange = xlRange.Offset(ColumnOffset:=1) xlOffsetRange.Value = 321 MRComObject(xlRange) 'ここも一旦デクリメントしておく事 xlRange = xlSheet.Range("E1") xlRange.Formula = "=C1+D1" MRComObject(xlOffsetRange) MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '14.セルの数式を取得する xlRange = xlSheet.Range("E1") Debug.Print(xlRange.Value.ToString) '444 Debug.Print(xlRange.Formula.ToString) '=C1+D1 MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '15.AutoFill メソッドを使ってセルに連続してデータを入力する 'AutoFill メソッド : 指定された対象セル範囲内のセルに対してオートフィルを実行します。 xlRange = xlSheet.Range("A1") xlRange.Value = "1月" xlRange1 = xlSheet.Range("A1:L1") 'セル A1 〜 L1 まで、1月 〜 12月 と入力します。 '下記のように直接範囲(xlSheet.Range("A1:L1"))を指定しない事 'xlRange.AutoFill(Destination:=xlSheet.Range("A1:L1"), Type:=Excel.XlAutoFill ...) xlRange.AutoFill(Destination:=xlRange1, Type:=Excel.XlAutoFillType.xlFillMonths) MRComObject(xlRange1) MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
11.VB2013 から Excel のセルに関する操作、1行 Tips 集その2 |
Private Sub Button31_Click(sender As Object, e As EventArgs) Handles Button31.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '==================== セルに関する操作1行Tips集その2 ======================= '1.アクティブセル領域(空白行と空白列で囲まれたセル範囲)を取得 Dim adrs1, adrs2 As String Dim msg As String = "" Dim xlRange As Excel.Range = Nothing 'Worksheet.Range プロパティは、セルまたはセル範囲を表す Range オブジェクトを返します。 xlRange = xlSheet.Range("A1:D5") 'xlSheet.Range プロパティが返す、Range オブジェクトを取得 xlRange.Value = 123 '指定範囲内に仮データを入力 MRComObject(xlRange) '従って使い終わったら直ぐ、デクリメントする事。 'ここで、違うセルを参照しているので(又は、変数名を別にするとか) xlRange = xlSheet.Range("F1:K5") xlRange.Value = "F1〜K5" MRComObject(xlRange) 'セル "A1:D5" の範囲と"F1:K5" の範囲にデータが入っているものとして xlRange = xlSheet.Range("B2") Dim xlCurrentRegion As Excel.Range = Nothing 'Range.CurrentRegion プロパティは、アクティブセル領域(Range オブジェクト)を返します。 xlCurrentRegion = xlRange.CurrentRegion adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) adrs2 = xlCurrentRegion.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlCurrentRegion) MRComObject(xlRange) msg = "No.1 セル [{0:}] のアクティブセル領域は、[{1:}] です。" Me.Focus() MessageBox.Show(Me, String.Format(msg, adrs1, adrs2)) xlRange = xlSheet.Range("H3") xlCurrentRegion = xlRange.CurrentRegion adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) adrs2 = xlCurrentRegion.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRange) MRComObject(xlCurrentRegion) MessageBox.Show(Me, String.Format(msg, adrs1, adrs2)) '------------------------------------------------------------------------------- xlRange = xlSheet.Range("A1:L20") xlRange.Value = Nothing MRComObject(xlRange) MessageBox.Show(Me, "一旦データを削除しました。") '------------------------------------------------------------------------------- '2.現在のセルに対して相対的な位置を指定・取得 xlRange = xlSheet.Range("A1:D5") xlRange.Value = "A1〜D5" Dim xlOffsetRange As Excel.Range = Nothing 'Range.Offset プロパティは、指定された範囲からのオフセットの範囲を表す Range オブジェクトを返す xlOffsetRange = xlRange.Offset(RowOffset:=2, ColumnOffset:=6) xlOffsetRange.Value = "Offset" adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRange) adrs2 = xlOffsetRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlOffsetRange) msg = "No.2 セル[{0:}]の Offset(RowOffset:=2, ColumnOffset:=6) の領域は、[{1:}]です。" MessageBox.Show(Me, String.Format(msg, adrs1, adrs2)) 'Offset プロパティの使用例は、VB2010からExcelを操作するためのワンポイントテクニック集内でも '幾つか使っていますので、最上部の[このページ内の検索ができます。]の所の検索ボックスに '[Offset]をキーにして検索して見て下さい。 '------------------------------------------------------------------------------- '3.対象となるセルが含まれる領域の終端のセルを取得 'End + 方向キー (↑、↓、←、→のいずれか) に相当します。 xlRange = xlSheet.Range("A1:E6") 'A1:E6 の範囲に仮データを入力 xlRange.Value = "A1〜E6" MRComObject(xlRange) Dim xlRangeEnd As Excel.Range xlRange = xlSheet.Range("D3") 'Range.End プロパティは,対象となるセルが含まれる領域の終端のセルを示すRangeオブジェクトを返す xlRangeEnd = xlRange.End(Excel.XlDirection.xlToLeft) adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRangeEnd) MRComObject(xlRange) msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの左端のセル位置は、" MessageBox.Show(Me, msg & adrs1 & " です。") xlRange = xlSheet.Range("D3") xlRangeEnd = xlRange.End(Excel.XlDirection.xlToRight) adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRangeEnd) MRComObject(xlRange) msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの右端のセル位置は、" MessageBox.Show(Me, msg & adrs1 & " です。") xlRange = xlSheet.Range("D3") xlRangeEnd = xlRange.End(Excel.XlDirection.xlUp) adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRangeEnd) MRComObject(xlRange) msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの上端のセル位置は、" MessageBox.Show(Me, msg & adrs1 & " です。") xlRange = xlSheet.Range("D3") xlRangeEnd = xlRange.End(Excel.XlDirection.xlDown) adrs1 = xlRangeEnd.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRangeEnd) MRComObject(xlRange) msg = "No.3 セル範囲 A1:E6 に対するセル位置 D3 からの下端のセル位置は、" MessageBox.Show(Me, msg & adrs1 & " です。") '------------------------------------------------------------------------------- '4.指定されたワークシートで使われたセル範囲を取得 'Worksheet.UsedRange プロパティは、指定されたワークシートで使われた 'セル範囲(Range オブジェクト)を返します。 xlRange = xlSheet.UsedRange adrs1 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRange) msg = "No.4 指定のシート内での使用済みセル範囲は、[ " MessageBox.Show(Me, msg & adrs1 & " ]です。") '------------------------------------------------------------------------------- '5.指定のセル範囲から指定した列数、行数分のセル範囲にサイズ変更し変更されたセル範囲を取得 'Range.Rows プロパティは、指定されたセル範囲の行を表す Range オブジェクトを返します。 xlRange = xlSheet.Range("B3") xlCurrentRegion = xlRange.CurrentRegion 'A1:E6 Dim xlResize As Excel.Range = Nothing Dim rowsCount, columnsCount As Integer Dim xlRows As Excel.Range = Nothing Dim xlColumns As Excel.Range = Nothing xlRows = xlCurrentRegion.Rows rowsCount = xlRows.Count 'Range.Columns プロパティは、指定されたセル範囲の列を表す Range オブジェクトを返します。 xlColumns = xlCurrentRegion.Columns columnsCount = xlColumns.Count xlResize = xlCurrentRegion.Resize(rowsCount + 1, columnsCount + 1) MRComObject(xlColumns) MRComObject(xlRows) 'Excel をアクティブにする(エクセルにフォーカスを移す。) AppActivate(xlApp.Caption) '必要ありませんが、見た目にわかりやすくする為に xlResize.Select() 'サイズ変更した範囲を選択 adrs1 = xlResize.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlResize) MRComObject(xlCurrentRegion) MRComObject(xlRange) msg = "No.5 セルB3に対するセル範囲[A1:E6]に対して、行・列 +1 したセル位置は、" MessageBox.Show(Me, msg & adrs1 & " です。") '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '6.セルを結合(マージ)する Dim xlMergeRange As Excel.Range xlMergeRange = xlSheet.Range("B10:D10") 'Range.Merge メソッドは、Range オブジェクト内のセルを結合して 1 つのセルにします。 xlMergeRange.Merge() xlMergeRange.Value = "セル [B10:D10] を結合しました" MRComObject(xlMergeRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '------------------------------------------------------------------------------- '7.指定のセル位置の結合セル範囲を取得する '指定のセルが結合セル範囲にある場合 'Range.MergeArea プロパティは、指定されたセルがある結合セル範囲を表すRangeオブジェクトを返す xlMergeRange = xlSheet.Range("C10") Dim xlMergeArea As Excel.Range xlMergeArea = xlMergeRange.MergeArea adrs1 = xlMergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False) MessageBox.Show(Me, "No.7 C10 の xlMergeArea セル位置は、" & adrs1 & " です。") MRComObject(xlMergeArea) MRComObject(xlMergeRange) '指定のセルが結合セル範囲にない場合は、指定したセル位置が返る xlMergeRange = xlSheet.Range("A10") xlMergeArea = xlMergeRange.MergeArea adrs1 = xlMergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False) MessageBox.Show(Me, "No.7 A10 の xlMergeArea セル位置は、" & adrs1 & " です。") MRComObject(xlMergeArea) MRComObject(xlMergeRange) '------------------------------------------------------------------------------- '8.指定のセル範囲に結合セルが含まれているかどうかを調べる 'Range.MergeCells プロパティは、セル範囲に結合セルが含まれている場合は、True を返します。 xlRange = xlSheet.Range("C10") If CBool(xlRange.MergeCells) = True Then MessageBox.Show(Me, "No.8 セル範囲(""C10"")には、結合セルが含まれます") End If MRComObject(xlRange) xlRange = xlSheet.Range("A10") If CBool(xlRange.MergeCells) = True Then MessageBox.Show(Me, "No.8 セル範囲(""A10"")には、結合セルが含まれます") Else MessageBox.Show(Me, "No.8 セル範囲(""A10"")には、結合セルが含まれていません") End If MRComObject(xlRange) '------------------------------------------------------------------------------- '9.使用されたセル範囲内の最後のセルを取得 'Range.SpecialCells メソッドは、指定された条件を満たしているすべてのセルを返します。 Dim xlSpCells As Excel.Range Dim xlRange2 As Excel.Range 'この場合、変数名を別にしないと解放されない。 xlSpCells = xlSheet.Cells xlRange2 = xlSpCells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell) xlRange2.Activate() adrs1 = xlRange2.Address(RowAbsolute:=False, ColumnAbsolute:=False) MRComObject(xlRange2) MRComObject(xlSpCells) MessageBox.Show(Me, "No.9 指定のシート内での使用済みの最後のセルは、[ " & adrs1 & " ]です。") '------------------------------------------------------------------------------- '11.指定のセル範囲内の空白のセルに、0 を代入する。 xlRange = xlSheet.Range("A1:D5") xlRange.Activate() xlRange.Value = "" '空白のセルを作成する MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) 'セル "B2:C4" の範囲に仮のデータを表示 xlRange = xlSheet.Range("B2:C4") xlRange.Value = "1234" MRComObject(xlRange) Dim xlBlanksRange As Excel.Range = Nothing Dim nn As Integer = 0 Dim xlRange1 As Excel.Range 'この場合、変数名を別にしないと解放されない。 xlRange1 = xlSheet.Range("A1:D5") '※ SpecialCells メソッドは、指定した範囲に該当のセルが見つからない場合エラーとなります。 Try '空白のセルを取得 xlBlanksRange = xlRange1.SpecialCells(Excel.XlCellType.xlCellTypeBlanks) '見つかった、空白のセルに指定のデータを入力 xlBlanksRange.Value = "0" '※ 数字(String)でないとエラーとなります。 '見つかった、空白のセル数を取得する nn = xlBlanksRange.Count MRComObject(xlRange1) MRComObject(xlBlanksRange) Catch ex As Exception nn = 0 End Try If nn = 0 Then msg = "No.10 セル範囲[A1:D5]のは空白のセルが見つかりませんでした。" MessageBox.Show(Me, msg) Else msg = "No.10 セル範囲[A1:D5]の空白のセル(" & nn.ToString & " 個)に 0 を代入しました。" MessageBox.Show(Me, msg) End If '------------------------------------------------------------------------------- '上記の他、SpecialCells メソッドの XlCellType 定数を指定する事で下記のようなセルを取得できます。 'xlCellTypeAllFormatConditions(表示形式が設定されているセル) 'xlCellTypeAllValidation(条件の設定が含まれているセル) 'xlCellTypeBlanks(空の文字列) 'xlCellTypeComments(コメントが含まれているセル) 'xlCellTypeConstants(定数が含まれているセル) 'xlCellTypeFormulas(数式が含まれているセル) 'xlCellTypeLastCell(使われたセル範囲内の最後のセル) 'xlCellTypeSameFormatConditions(同じ表示形式が設定されているセル) 'xlCellTypeSameValidation(同じ条件の設定が含まれているセル) 'xlCellTypeVisible(すべての可視セル) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
12.VB2013 から Excel のセルに関する操作、1行 Tips 集その3 |
Private Sub Button32_Click(sender As Object, e As EventArgs) Handles Button32.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '==================== セルに関する操作1行Tips集その3 ======================= '------------------------------------------------------------------------------- '1.Range オブジェクトの色々な、Clear メソッドを試す '・Range.Clear メソッド (オブジェクト全体をクリアします。) '指定のシートの指定のセル範囲のデータと数式と書式設定を削除します。 MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(Range.Clear)を試したいデータ" & _ "(数式・書式・文字)等を入力して下さい。") Dim xlRange As Excel.Range = xlSheet.Range("A1:A4") xlRange.Clear() MRComObject(xlRange) '・Range.ClearContents メソッド(選択範囲から数式と文字を削除します。) '指定のシートの指定のセル範囲の書式設定を残して、数式と文字を削除します。 MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(ClearContents)を" & _ "試したいデータ(数式・書式・文字)等を入力して下さい。") xlRange = xlSheet.Range("A1:A4") xlRange.ClearContents() MRComObject(xlRange) '・Range.ClearFormats メソッド(オブジェクトの書式設定を削除します。) '指定のシートの指定のセル範囲のすべての書式設定を削除します。(数式やデータは削除されません。) MessageBox.Show(Me, "セル A1 〜 A4 の範囲に(ClearFormats)を" & _ "試したいデータ(数式・書式・文字)等を入力して下さい。") xlRange = xlSheet.Range("A1:A4") xlRange.ClearFormats() MRComObject(xlRange) '上記の他、下記のようなメソッドも用意されています。(別の項で紹介予定) '・Range.ClearComments メソッド(指定されたセル範囲からすべてのコメントを消去します。) '・Range.ClearNotes メソッド(指定されたセル範囲内のすべてのセルからコメントを削除します。) '・Range.ClearOutline メソッド(指定した範囲のアウトラインを消去します。) '確認のために、1秒間表示しておく WT.WaitTime(1000) '仮データの入力 Dim xlRangeDat As Excel.Range = Nothing Dim n As Integer = 0 For r As Integer = 1 To 10 For c As Integer = 1 To 5 n += 1 xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) xlRangeDat.Value = n MRComObject(xlRangeDat) Next Next '確認のために、1秒間表示しておく WT.WaitTime(1000) '2.セル(セル範囲)をコピー及び貼り付ける Dim xlCopyRange As Excel.Range = xlSheet.Range("B2") Dim xlDestRange As Excel.Range = xlSheet.Range("G2") xlCopyRange.Copy(Destination:=xlDestRange) MRComObject(xlCopyRange) MRComObject(xlDestRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '3.セル(表全体)をコピー及び貼り付ける Dim xlCurrentRegion As Excel.Range xlCopyRange = xlSheet.Range("B2") xlCurrentRegion = xlCopyRange.CurrentRegion xlDestRange = xlSheet.Range("A15") xlCurrentRegion.Copy(Destination:=xlDestRange) MRComObject(xlCurrentRegion) MRComObject(xlCopyRange) MRComObject(xlDestRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '4.セル(セル範囲)を移動する xlCopyRange = xlSheet.Range("C3") xlDestRange = xlSheet.Range("H3") xlCopyRange.Cut(Destination:=xlDestRange) MRComObject(xlCopyRange) MRComObject(xlDestRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '5.セル(表全体)をを移動する xlCopyRange = xlSheet.Range("B2") xlCurrentRegion = xlCopyRange.CurrentRegion xlDestRange = xlSheet.Range("G11") xlCurrentRegion.Cut(Destination:=xlDestRange) MRComObject(xlCurrentRegion) MRComObject(xlCopyRange) MRComObject(xlDestRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '6.形式を選択して貼り付け xlRange = xlSheet.UsedRange xlRange.Clear() MRComObject(xlRange) n = 0 For r As Integer = 1 To 5 For c As Integer = 1 To 5 n += 1 xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) xlRangeDat.Value = n MRComObject(xlRangeDat) Next Next '確認のために、1秒間表示しておく WT.WaitTime(1000) xlRange = xlSheet.Range("A1:F6") 'Excel をアクティブにする(エクセルにフォーカスを移す。) AppActivate(xlApp.Caption) '必要ありませんが、見た目にわかりやすくする為に xlRange.Select() SendKeys.SendWait("%+(=)") MRComObject(xlRange) xlCopyRange = xlSheet.Range("B2") xlCurrentRegion = xlCopyRange.CurrentRegion xlCurrentRegion.Copy() MRComObject(xlCurrentRegion) MRComObject(xlCopyRange) xlDestRange = xlSheet.Range("A10") xlDestRange.PasteSpecial(Excel.XlPasteType.xlPasteValues) MRComObject(xlDestRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '7.セルのエラー値を取得する 'xlRange = xlSheet.UsedRange 'xlRange.Clear() 'Excel 上にエラーを発生(生成)させる xlRange = xlSheet.Range("A1") : xlRange.Formula = "#DIV/0!" MRComObject(xlRange) xlRange = xlSheet.Range("A2") : xlRange.Formula = "#N/A" MRComObject(xlRange) xlRange = xlSheet.Range("A3") : xlRange.Formula = "#NAME?" MRComObject(xlRange) xlRange = xlSheet.Range("A4") : xlRange.Formula = "#NULL!" MRComObject(xlRange) xlRange = xlSheet.Range("A5") : xlRange.Formula = "#NUM!" MRComObject(xlRange) xlRange = xlSheet.Range("A6") : xlRange.Formula = "#REF!" MRComObject(xlRange) xlRange = xlSheet.Range("A7") : xlRange.Formula = "#VALUE!" MRComObject(xlRange) xlRange = xlSheet.Range("A8") : xlRange.Value = CDec("1234567890123") 'この場合、Style オブジェクトでなく、Style プロパティなので、解放処理は必要ありません。 xlRange.Style = "Currency [0]" xlRange.ColumnWidth = 8 MRComObject(xlRange) 'Excel(上にエラーを発生させるマクロ) 'Sub Macro1() ' myArray = Array(xlErrDiv0, xlErrNA, xlErrName, xlErrNull, _ ' xlErrNum, xlErrRef, xlErrValue) ' For i = 1 To 7 ' Worksheets("Sheet1").Cells(i, 1).Value = CVErr(myArray(i - 1)) ' Next i 'End Sub 'MessageBox.Show("Excel 上にエラーを発生させておいて下さい。") '確認のために、2秒間表示しておく WT.WaitTime(2000) Dim xlFunction As Excel.WorksheetFunction = xlApp.WorksheetFunction For r As Integer = 1 To 10 For c As Integer = 1 To 3 xlRangeDat = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) If xlFunction.IsError(xlRangeDat) Then 'セル上のエラーの発生場所とエラーの種類を取得 Debug.Print(" R" & r.ToString & ", C" & c.ToString & " で " & _ xlRangeDat.Text.ToString & vbTab & "(" & xlRangeDat.Value.ToString & _ ") のエラーが発生しました。") 'エラーが表示しているセルの書式設定を残して、数式と文字を削除(お好みで) xlRangeDat.ClearContents() End If '文字数に対して表示列幅が不足して[####]のように表示しているセルを改善。 If xlRangeDat.Text.ToString.Length > 3 AndAlso _ xlRangeDat.Text.ToString.Substring(0, 3) = "###" Then 'データの文字列長に合せて列幅を自動調整 xlRange = xlRangeDat.Columns xlRange.AutoFit() MRComObject(xlRange) End If MRComObject(xlRangeDat) Next Next MRComObject(xlFunction) '上記実行結果 'R1, C1 で #DIV/0! (-2146826281) のエラーが発生しました。 'R2, C1 で #N/A (-2146826246) のエラーが発生しました。 'R3, C1 で #NAME? (-2146826259) のエラーが発生しました。 'R4, C1 で #NULL! (-2146826288) のエラーが発生しました。 'R5, C1 で #NUM! (-2146826252) のエラーが発生しました。 'R6, C1 で #REF! (-2146826265) のエラーが発生しました。 'R7, C1 で #VALUE! (-2146826273) のエラーが発生しました。 '確認のために、3秒間表示しておく WT.WaitTime(1000) '8.セルにコメントを表示及びコメント操作いろいろ Call CommentsTest() '確認のために、3秒間表示しておく WT.WaitTime(1000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub Private Sub CommentsTest() '8.セルにコメントを表示する '============================================================================= 'セル A3 にコメントを新規作成(追加)します。 Dim xlRange As Excel.Range = Nothing Dim xlComment As Excel.Comment xlRange = xlSheet.Range("A3") xlComment = xlRange.AddComment("セル A1 と A2 の合計です") MRComObject(xlComment) MRComObject(xlRange) xlRange = xlSheet.Range("C8") xlComment = xlRange.AddComment("ついでにもう1個作成しました。") MRComObject(xlComment) MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '---------------------------------------------- 'セル E3 にコメントを記入又は変更します。 xlRange = xlSheet.Range("E3") xlRange.NoteText("変更予定") MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '---------------------------------------------- '最初のコメントを表示します。 Dim xlComments As Excel.Comments xlComments = xlSheet.Comments xlComment = xlComments.Item(1) xlComment.Visible = True MRComObject(xlComment) MRComObject(xlComments) '確認のために、1秒間表示しておく WT.WaitTime(1000) '---------------------------------------------- 'すべてのコメントを表示します。 xlComments = xlSheet.Comments For Each xlComment In xlComments xlComment.Visible = True MRComObject(xlComment) Next MRComObject(xlComments) '確認のために、1秒間表示しておく WT.WaitTime(1000) '---------------------------------------------- 'セル範囲を指定してコメントを削除 xlRange = xlSheet.Range("A1:A7") xlRange.ClearComments() MRComObject(xlRange) '確認のために、1秒間表示しておく WT.WaitTime(1000) '---------------------------------------------- '記入しているコメントを全て削除 xlComments = xlSheet.Comments For Each xlComment In xlComments xlComment.Delete() MRComObject(xlComment) Next MRComObject(xlComments) End Sub |
13.VB2013 から Excel の表示処理速度を向上テスト |
Private Sub Button33_Click(sender As Object, e As EventArgs) Handles Button33.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '========================== 表示処理速度を向上及び検索 ======================= '-------------------------------------------------------------------------- '仮データの入力 Dim xlRangeDat As Excel.Range = Nothing Dim xlRange As Excel.Range = Nothing Dim nRnd As New System.Random() Dim sTime0 As DateTime Dim eTime0 As DateTime xlApp.ScreenUpdating = False For i As Integer = 1 To 2 xlApp.ScreenUpdating = True '画面の更新を停止して表示処理速度を向上させる If i = 1 Then xlApp.ScreenUpdating = False sTime0 = Now '処理時間計測開始 For c As Integer = 1 To 50 For r As Integer = 1 To 50 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) '1 〜 100 までのランダムなデータを作成 xlRange.Value = Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString & _ Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString MRComObject(xlRange) Next r Next c '画面の更新をする(デフォルトに戻す) xlApp.ScreenUpdating = True eTime0 = Now '処理時間計測終了 ' 3.8 秒 → 7.3 秒 現環境でも、2.71 秒 → 3.62 秒 MessageBox.Show(Me, eTime0.Subtract(sTime0).TotalSeconds & " 秒かかりました。") Next i '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
14.VB2013から Excel のマクロを作成し実行する |
Private Sub Button34_Click(sender As Object, e As EventArgs) Handles Button34.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '==================== VB2013からマクロを作成し実行する ======================= 'Imports Microsoft.Vbe.Interop 'を記入の事 'ファイル→オプション→セキュリティセンター→セキュリティセンターの設定→マクロの設定→ 'VBA プロジェクトオブジェクトモデルへのアクセスを信頼する にチェックを入れておく事。 Dim xlVBE As Microsoft.Vbe.Interop.VBE Dim xlProject As Microsoft.Vbe.Interop.VBProject Dim xlComponents As Microsoft.Vbe.Interop.VBComponents = Nothing Dim xlComponent As Microsoft.Vbe.Interop.VBComponent = Nothing Dim xlCodeModule As Microsoft.Vbe.Interop.CodeModule xlVBE = xlApp.VBE xlProject = CType(xlBook.VBProject, Microsoft.Vbe.Interop.VBProject) xlComponents = xlProject.VBComponents xlComponent = xlComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule) xlCodeModule = xlComponent.CodeModule '標準モジュールに記入するマクロのコード Dim MacroCord As String = "" 'CVErr 関数は、VB2013 には無く、VB2013 からは、使用できないようなので、マクロで実行 MacroCord = _ "Public Sub MacroTest()" & vbCrLf & _ " Dim myArray As Variant, i As Long" & vbCrLf & _ " myArray = Array(xlErrDiv0, xlErrNA, xlErrName, xlErrNull, xlErrNum, _" & vbCrLf & _ " xlErrRef, xlErrValue)" & vbCrLf & _ " For i = 1 To 7" & vbCrLf & _ " Worksheets(""Sheet1"").Cells(i, 1).Value = CVErr(myArray(i - 1))" & vbCrLf & _ " Next i" & vbCrLf & _ "End Sub" 'マクロのコードを標準モジュールに書き込み '変数の宣言を強制するにチェックが入っているとエラーとなるのでコメントに 'oCode.InsertLines(1, "Option Explicit") xlCodeModule.InsertLines(2, MacroCord) '作成したマクロを実行する xlApp.Run("MacroTest") MessageBox.Show(Me, "VB2013 から MacroTest マクロを作成し、実行しました。") '記入したマクロを削除する xlComponents.Remove(xlComponent) MessageBox.Show(Me, "VB2013 から作成した MacroTest マクロを削除しました。") MRComObject(xlCodeModule) MRComObject(xlComponent) MRComObject(xlComponents) MRComObject(xlProject) MRComObject(xlVBE) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
15.Addressプロパティの使用例 |
Private Sub Button35_Click(sender As Object, e As EventArgs) Handles Button35.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '========================= Address プロパティの使用例 ======================== '------------------------------------------------------------------------------- '1.セル(範囲)のアドレスを取得する ' ここにきて、Address プロパティ を多用していて、Excel.exe が解放されなくなったので ' Tips 集を見直すにあたり、調べて解った事を書いておきます。 ' Range.Address(プロパティ) をVBA のヘルプで見ると以下のようになっております。 ' コード記述時の言語で参照範囲を表す文字列型 (String) の値を返します。 ' 式.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo) ' 式 Range オブジェクトを表す変数です。 ' 使用例() 'mc = Worksheets("Sheet1").Cells(1, 1) 'MsgBox(mc.Address()) ' $A$1 'MsgBox(mc.Address(RowAbsolute:=False)) ' $A1 'MsgBox(mc.Address(ReferenceStyle:=xlR1C1)) ' R1C1 'MsgBox(mc.Address(ReferenceStyle:=xlR1C1, RowAbsolute:=False, _ ' ColumnAbsolute:=False, RelativeTo:=Worksheets(1).Cells(3, 3))) ' R[-2]C[-2] 'となっており、VB2013 用に書きかえるのもそう難しいことでもないかと思います。 '通常は、下記のように書きかえて使用すれば問題はないのですが...。 Dim xlRange As Excel.Range = Nothing xlRange = xlSheet.Range("A1:D5") Dim adrs1, adrs2, adrs3, adrs4 As String adrs1 = xlRange.Address ' $A$1:$D$5 adrs2 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) ' A1:D5 adrs3 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _ ReferenceStyle:=Excel.XlReferenceStyle.xlA1) ' A1:D5 adrs4 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _ ReferenceStyle:=Excel.XlReferenceStyle.xlR1C1) ' RC:R[4]C[3] MRComObject(xlRange) MessageBox.Show(Me, String.Format( _ "adrs1={0:} adrs2={1:} adrs3={2:} adrs4={3:}", adrs1, adrs2, adrs3, adrs4)) '個々で使用する場合は、問題無いのですが、以下で紹介するコードと同じプロシージャ内で使用すると 'Excel.exe が解放されず、プログラムを終了するまで、タスクマネージャーに残ったままになったり 'する場合があります。 '------------------------------------------------------------------------------- 'プロセスが解放され易くしたコード(逐次デクリメントを実施) xlRange = xlSheet.Range("B3:F7") adrs1 = xlRange.Address ' $B$3:$F$7 MRComObject(xlRange) xlRange = xlSheet.Range("B3:F7") adrs2 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False) ' B3:F7 MRComObject(xlRange) xlRange = xlSheet.Range("B3:F7") adrs3 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _ ReferenceStyle:=Excel.XlReferenceStyle.xlA1) ' B3*F7 MRComObject(xlRange) xlRange = xlSheet.Range("B3:F7") adrs4 = xlRange.Address(RowAbsolute:=False, ColumnAbsolute:=False, _ ReferenceStyle:=Excel.XlReferenceStyle.xlR1C1) ' R[2]C[1]:R[6]C[5] MRComObject(xlRange) MessageBox.Show(Me, String.Format( _ "adrs1={0:} adrs2={1:} adrs3={2:} adrs4={3:}", adrs1, adrs2, adrs3, adrs4)) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
16.シートの指定範囲内を検索 |
Private Sub Button36_Click(sender As Object, e As EventArgs) Handles Button36.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '========================== シートの指定範囲内を検索 ======================= '仮データの入力 Dim xlRangeDat As Excel.Range = Nothing Dim xlRange As Excel.Range = Nothing Dim nRnd As New System.Random() '画面の更新を停止して表示処理速度を向上させる xlApp.ScreenUpdating = False For c As Integer = 1 To 50 For r As Integer = 1 To 50 xlRange = xlSheet.Range(R1ToA1(r, c), R1ToA1(r, c)) 'あ 〜 ば までのランダムなデータを作成 xlRange.Value = Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString & _ Strings.ChrW(CInt(nRnd.Next(12354, 12400))).ToString MRComObject(xlRange) Next r Next c '画面の更新をする(デフォルトに戻す) xlApp.ScreenUpdating = True '[あい]を検索検索して見つかったセルをアクティブにする Dim xlCells As Excel.Range = Nothing Dim xlInterior As Excel.Interior = Nothing '下記のように、Cells プロパティを引数無しで使用しても解放されますが、 '検索範囲が解っているので、xlRange = xlSheet.Range(R1ToA1(1, 1), R1ToA1(50, 50)) の 'ようにした方が解放されやすい。 '尚、 xlSheet.Cells は、 xlSheet.Range("1:1048576") や xlSheet.Range("$1:$1048576") や 'xlSheet.Range("A1:XFD1048576") と指定するのも同じ事です。 'xlCells = xlSheet.Cells xlCells = xlSheet.Range(R1ToA1(1, 1), R1ToA1(50, 50)) xlRange = xlCells.Find("あい") If xlRange IsNot Nothing Then xlRange.Activate() xlInterior = xlRange.Interior xlInterior.Color = Color.Red xlApp.Goto(Reference:=xlRange, Scroll:=True) MessageBox.Show(Me, "大吉! 愛は、" & xlRange.Address & " に見つかりました。") ' Debug.Print(xlRange.Address) MRComObject(xlInterior) MRComObject(xlRange) Else MessageBox.Show(Me, "凶! 愛は、見つかりませんでした。") End If MRComObject(xlCells) '確認のために、1秒間表示しておく WT.WaitTime(1000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
17.自作関数を使って罫線を描画 |
Private Sub Button37_Click(sender As Object, e As EventArgs) Handles Button37.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '========================== 自作関数を使って罫線を描画 ======================= '開始点、終了点、線種、線の太さ、位置(定数値) を指定 '位置が 0 の場合は格子状に引く(省略可) Call SetLine(2, 2, 8, 8, Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, 0) '外枠を太線で描画 Call SetLine(2, 2, 8, 8, Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThick, 34) '2重線で下の上側に引く Call SetLine(8, 2, 8, 8, Excel.XlLineStyle.xlDouble, Excel.XlBorderWeight.xlThick, Excel.XlBordersIndex.xlEdgeTop) WT.WaitTime(3000) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub Private Function R1ToA1(ByVal r1 As Integer, ByVal c1 As Integer) As String 'R1C1形式のアドレスをA1形式に変換する関数 Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim A1 As String = "" If c1 < 1 Or c1 > 16384 Then MessageBox.Show("指定が間違っています。") A1 = "A1" Return A1 End If If c1 <= 26 Then A1 = s.Chars(c1 - 1) & CStr(r1) ElseIf c1 <= 702 Then A1 = s.Chars(((c1 - 1) \ 26) - 1) & s.Chars(((c1 - 1) Mod 26)) & CStr(r1) Else A1 = s.Chars(((c1 - 703) \ 676)) & s.Chars((((c1 - 703) \ 26) Mod 26)) & _ s.Chars(((c1 - 1) Mod 26)) & CStr(r1) End If Return A1 End Function '罫線を引く自作関数 '開始点、終了点、線種、線の太さ、位置(定数値) を指定 'SetLine(2, 2, 8, 8, は (B2:H8) になります。 '位置が 0 の場合は格子状に引く(省略可) '位置が 34 の場合は外枠線を描く ' 5=左上から右下への罫線 ' 6=左下から右上への罫線 ' 7=セルの左辺の罫線 ' 8=セルの上辺の罫線 ' 9=セルの下辺の罫線 ' 10=セルの右辺の罫線 ' 11=内側の垂直線 ' 12=内側の水平線 'http://hanatyan.sakura.ne.jp/dotnet/Excel06.htm#no3 を参照願います。 Private Sub SetLine(ByVal r1 As Integer, ByVal c1 As Integer, _ ByVal r2 As Integer, ByVal c2 As Integer, _ ByVal ls As Integer, ByVal lw As Integer, _ Optional ByVal lps As Integer = 0) Dim xlRange As Excel.Range Dim xlBorders As Excel.Borders Dim xlBorder As Excel.Border '線を引く範囲をA1形式で取得 xlRange = xlSheet.Range(R1ToA1(r1, c1), R1ToA1(r2, c2)) xlBorders = xlRange.Borders If lps = 0 Then '格子状に罫線を引く xlBorders.LineStyle = ls xlBorders.Weight = lw ElseIf lps = 34 Then '外枠線を描く For i As Int32 = 7 To 10 xlBorder = xlBorders(DirectCast(i, Excel.XlBordersIndex)) '罫線の表示位置を設定 xlBorder.LineStyle = ls '罫線の線種を設定 xlBorder.Weight = lw '罫線の太さを設定 MRComObject(xlBorder) Next i Else '個別に罫線を引く xlBorder = xlBorders(DirectCast(lps, Excel.XlBordersIndex)) '罫線の表示位置を設定 xlBorder.LineStyle = ls '罫線の線種を設定 xlBorder.Weight = lw '罫線の太さを設定 MRComObject(xlBorder) End If MRComObject(xlBorders) MRComObject(xlRange) End Sub |
18.Excel の Speech.Speak での音声読み上げ |
Private Sub Button38_Click(sender As Object, e As EventArgs) Handles Button38.Click 'ExcelのSpeech.Speak で読み上げ Dim xlApp As New Microsoft.Office.Interop.Excel.Application Dim xlSpeech As Microsoft.Office.Interop.Excel.Speech xlSpeech = xlApp.Speech xlSpeech.Speak("テキストボックスの 内容を読み上げます。") 'xlSpeech 及び xlApp を解放 xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSpeech) xlSpeech = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) xlApp = Nothing '============================================================================= 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
19.Excel の GetPhonetic メソッドを使ってのふりがなを取得 |
Private Sub Button39_Click(sender As Object, e As EventArgs) Handles Button39.Click 'Excel の GetPhonetic メソッドを使ってのふりがなを取得 Dim xlApp As New Excel.Application Dim myName As String Dim furigana As String '文字列中の空白を除去(Microsoft.VisualBasic.Strings. を省略しております) myName = StrConv("山田 花子", VbStrConv.Wide).Replace(" ", "") 'ExcelのGetPhonetic関数を使ってふりがなを取得 furigana = xlApp.GetPhonetic(myName) '取得したふりがなをひらがなに変換(お好みで) TextBox1.Text = "山田 花子 :" & StrConv(furigana, VbStrConv.Hiragana) 'xlApp を解放 xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) xlApp = Nothing '=================================================================================================== 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() '正常に動作する事が確認できたらこの行は、コメントにして下さい。 End Sub |
20. |
検索キーワード及びサンプルコードの別名(機能名) |