VB.NETでエクセルシートに日付と曜日を書き込むには?

解決


  2006-07-10 19:29:25  No: 132291

こんにちは良です。いつもお世話になっております。

環境はExcel2003でVB.NET2003WInXpです。
コンボボックスで○○年○○月〜○○年○○月
と指定してそこの値からエクセルシートに
セル範囲を指定してそこのセルに日にちと
曜日を出したいのですがうまく出力されません。

どんな関数を使ったら出せるのでしょうか?


特攻隊長まるるう  2006-07-10 21:52:09  No: 132292

>うまく出力されません。
セルの書式設定をしておけば、何もプログラムしなくても表示できますが?


  2006-07-10 23:32:17  No: 132293

こんにちは良です。

<特攻隊長まるるうさん

お返事ありがとうございます!
説明不足ですみません。

「コンボボックスで○○年○○月〜○○年○○月
と指定して」

というのはVB.NETのフォーム上にあるコンボボックスで
それを指定してボタンを押すと
エクセルの画面が起動して
そこで指定したセルにその月の日にちと曜日が
一気に出るようにしたいんですが
セルの書式設定でできますか?


medaka  2006-07-10 23:42:22  No: 132294

どううまくいかないの?
曜日なら書式設定だけでできますけど
エクセルの操作なら過去ログに山のようにあるし

具体的にどういうコード書いてどんなエラーがでたとか書いたほうがいいと
思います


  2006-07-11 02:27:24  No: 132295

'表示開始日付算出
        '    Dim dtViewStartDate As New Date(Me.cmbYearStart.Text, Me.cmbMonthStart.Text, "06")
        '    dtViewStartDate = dtViewStartDate.AddMonths(-1)
        '    ' 表示終了日付算出
        '    Dim dtViewEndDate As New Date(Me.cmbYearEnd.Text, Me.cmbMonthEnd.Text, "05")

        '    '日にちを格納
        '    shtDay = System.DateTime.DaysInMonth(Me.cmbYearStart.Text, Me.cmbMonthStart.Text - 1)

        '    '選択された月の前月の日数分ループ
        '    For intX = 1 To shtDay

        '        '選択された月の前月の日数分1行ずつ行を追加する
        '        xlRange3 = xlCells(intX + 2, 5)

        '        '曜日を算出
        '        strPutData = WeekdayName(Weekday(dtViewStartDate))

        '        '選択された月の前月の6日から1日ずつ追加していく
        '        dtViewStartDate = dtViewStartDate.AddDays(+1)

        '        'xlRangeの解放(都度解放しないとだめ)
        '        ComObjectRelease(xlRange3)
        '    Next
こんにちは良です。

>medakaさん

とりあえず書いてみたコードです。
とりあえずコンボで2006年6月
っていれたら2006年5月6日から
2006年6月の5日までをxlCells(intX + 2, 5)に
出力する(日にちが増えるとintXの分だけ増える)
という風にしたいんですが実行したらエラーも
出ないで出力結果にも何も残りませんでした。


  2006-07-11 02:28:11  No: 132296

あ。  shtDayは 
'Dim shtDay As Short
です。


特攻隊長まるるう  2006-07-11 02:57:36  No: 132297

>とりあえずコンボで2006年6月
>っていれたら2006年5月6日から
>2006年6月の5日までを
…こう…他人には意味不明な仕様を盛り込むのは…嫌がらせですか?w
とりあえず、コンボボックスを半分(Me.cmbYearStart, Me.cmbMonthStart)に
して、指定月1ヶ月分の出力ができるようになってから応用問題に取り組めば?
結局、dtViewEndDate は使ってないんだし、関係無いものは削除しておいて
ください。

> 出力結果にも何も残りませんでした。
どこにも何か出力するような処理は書かれていませんが?

…作り直し。


  2006-07-11 03:02:56  No: 132298

こんばんは良です。

>特攻隊長まるるうさん

・・・そうですね。
すみませんm(__)m
作り直します・・・


  2006-07-11 03:12:30  No: 132299

皆様混乱させてしまって申し訳ございませんm(__)m

なんか私のほうが混乱しているみたいです。

もう少し処理を考えます。


特攻隊長まるるう  2006-07-11 04:24:23  No: 132300

カルチャの情報とか、配列書込みとか、新しい情報が多かったので
サンプル作りました。

処理が不明な部分は適当に解釈してます。
エラー処理が面倒なので(日付として有効か?とか)DateTimePicker 使いました。
2個貼り付けてから実行してください。
[VB.NET2003]
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim objDatax(,) As Object

        objDatax = MakeData()
        If objDatax Is Nothing Then
            Exit Sub
        End If

        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        '新規のファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets.Item(1), Excel.Worksheet)
        Dim xlRange As Excel.Range = xlSheet.Range("$C$1")

        xlApp.Visible = True

        Call ExcelWrite(xlRange, MakeData)

        Call ComObjectRelease(CType(xlRange, Object))
        Call ComObjectRelease(CType(xlSheet, Object))
        Call ComObjectRelease(CType(xlSheets, Object))
        Call ComObjectRelease(CType(xlBook, Object))
        Call ComObjectRelease(CType(xlBooks, Object))
        Call ComObjectRelease(CType(xlApp, Object))
    End Sub

    Private Function MakeData() As Object(,)
        Dim CulInfo As System.Globalization.CultureInfo _
        = System.Globalization.CultureInfo.CurrentCulture
        Dim DTInfo As System.Globalization.DateTimeFormatInfo _
        = CulInfo.DateTimeFormat()
        Dim dtViewStartDate, dtViewEndDate As Date
        Dim diff1 As TimeSpan
        Dim objData(,) As Object
        Dim strPutData As String
        Dim intX, intDays As Integer

        ' 表示開始日付算出
        With Me.DateTimePicker1.Value
            dtViewStartDate = New Date(.Year, .Month, .Day)
        End With
        ' 表示終了日付算出
        With Me.DateTimePicker2.Value
            dtViewEndDate = New Date(.Year, .Month, .Day)
        End With

        '日にちを格納
        diff1 = dtViewEndDate.Subtract(dtViewStartDate)
        intDays = diff1.Days
        If intDays <= 0 Then
            MessageBox.Show("開始日付は終了日付より前を選んでください。")
            Return Nothing
        End If

        '選択された日数分ループ
        ReDim objData(intDays + 1, 4)
        For intX = 0 To intDays
            With dtViewStartDate
                '年月日
                objData(intX + 1, 0) = dtViewStartDate
                objData(intX + 1, 1) = .Year
                objData(intX + 1, 2) = .Month
                objData(intX + 1, 3) = .Day
                '曜日を算出
                strPutData = DTInfo.GetDayName(.DayOfWeek)
                objData(intX + 1, 4) = strPutData

                '1日ずつ追加していく
                dtViewStartDate = .AddDays(+1)
            End With
        Next
        Return objData
    End Function

    Private Sub ExcelWrite(ByRef TopCell As Excel.Range, ByRef Datax(,) As Object)
        Dim TargetRange As Excel.Range
        With Datax
            TargetRange = TopCell.Resize((.GetLength(0) - 1) + 1, (.GetLength(1) - 1) + 1)
        End With
        TargetRange.Value = Datax
        Call ComObjectRelease(CType(TargetRange, Object))
    End Sub

    Private Sub ComObjectRelease(ByRef objCom As Object)
        'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
        Try
            '提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします
            If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
                                                      Marshal.IsComObject(objCom) Then
                Dim I As Integer
                Do
                    I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                Loop Until I <= 0
            End If
        Catch
        Finally
            '参照を解除する
            objCom = Nothing
        End Try
    End Sub


  2006-07-11 05:36:52  No: 132301

こんばんは良です。

>特攻隊長まるるうさん

ありがとうございます!
これで求めていた答えが出そうです!

本当にいつもいつもすみませんm(__)m
本当にありがとうございました。

蛇足なんですがDateTimePicker1とDateTimePicker2が
Newされていなかったので 
  Dim DateTimePicker1 As New DateTimePicker
        Dim DateTimePicker2 As New DateTimePicker
として
   dtViewStartDate = New Date(設定したいもの(コンボボックスとか))
dtViewEndDate = New Date(設定したいもの(コンボボックスとか)))

にしたらうまくできました。
本当に本当にありがとうございましたm(__)m
そしていつもすみませんです・・・


特攻隊長まるるう  2006-07-11 19:03:44  No: 132302

>蛇足なんですがDateTimePicker1とDateTimePicker2が
>Newされていなかったので
DateTimePicker は、標準で用意されているコントロールなので、
デザイン画面で貼り付ければ自動で New されるコードが追加
されます。
> " Windows フォーム デザイナで生成されたコード "
の中の話になりますが。

>   dtViewStartDate = New Date(設定したいもの(コンボボックスとか))
サンプルでは、コンボボックスの代わりに DateTimePicker を使ったと
いうことです。


特攻隊長まるるう  2006-07-11 19:36:11  No: 132303

あと、Button1_Click の中の
>        Call ExcelWrite(xlRange, MakeData)

        Call ExcelWrite(xlRange, objDatax)
でいいから。…2回も計算してました(汗)。修正してください。


  2006-07-11 19:47:46  No: 132304

おはようございます。良です

>特攻隊長まるるうさん

>Call ExcelWrite(xlRange, objDatax)
>でいいから。…2回も計算してました(汗)。修正してください。

わかりました。修正しておきます。


特攻隊長まるるう  2006-07-11 21:02:35  No: 132305

ついでに別解。
書式を設定してエクセルに全てお任せバージョン。
エクセルのセル参照式(=MONTH(C2)とか)を書き込んでもできますね。
[VB.NET2003, Excel 2002(SP2)]
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim dtViewStartDate, dtViewEndDate As Date
        Dim diff1 As TimeSpan
        Dim intDays As Integer

        ' 表示開始日付算出
        With Me.DateTimePicker1.Value
            dtViewStartDate = New Date(.Year, .Month, .Day)
        End With
        ' 表示終了日付算出
        With Me.DateTimePicker2.Value
            dtViewEndDate = New Date(.Year, .Month, .Day)
        End With

        '日にちを格納
        diff1 = dtViewEndDate.Subtract(dtViewStartDate)
        intDays = diff1.Days
        If intDays <= 0 Then
            MessageBox.Show("開始日付は終了日付より前を選んでください。")
            Exit Sub
        End If

        Dim objDatax(1, 4) As Object
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        '新規のファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets.Item(1), Excel.Worksheet)
        Dim xlTopCell As Excel.Range = xlSheet.Range("$C$1")
        Dim xlDataTopCell As Excel.Range = xlTopCell.Offset(1, 0)
        Dim xlSourceRange As Excel.Range
        Dim xlTargetRange As Excel.Range
        Dim strAddressFx As String

        xlApp.Visible = True

        objDatax(0, 0) = "日付"
        objDatax(0, 1) = "年"
        objDatax(0, 2) = "月"
        objDatax(0, 3) = "日"
        objDatax(0, 4) = "曜日"

        objDatax(1, 0) = dtViewStartDate
        strAddressFx = "=" & xlDataTopCell.Address(False, False)
        objDatax(1, 1) = strAddressFx
        objDatax(1, 2) = strAddressFx
        objDatax(1, 3) = strAddressFx
        objDatax(1, 4) = strAddressFx
        Call ExcelWrite(xlTopCell, objDatax)

        xlTargetRange = xlDataTopCell.Offset(0, 1)
        xlTargetRange.NumberFormatLocal = "yyyy"
        Call ComObjectRelease(CType(xlTargetRange, Object))
        xlTargetRange = xlDataTopCell.Offset(0, 2)
        xlTargetRange.NumberFormatLocal = "mm"
        Call ComObjectRelease(CType(xlTargetRange, Object))
        xlTargetRange = xlDataTopCell.Offset(0, 3)
        xlTargetRange.NumberFormatLocal = "dd"
        Call ComObjectRelease(CType(xlTargetRange, Object))
        xlTargetRange = xlDataTopCell.Offset(0, 4)
        xlTargetRange.NumberFormatLocal = "aaaa"
        Call ComObjectRelease(CType(xlTargetRange, Object))

        With objDatax
            xlSourceRange = xlDataTopCell.Resize(1, (.GetLength(1) - 1) + 1)
            xlTargetRange = xlDataTopCell.Resize(intDays + 1, (.GetLength(1) - 1) + 1)
        End With
        xlSourceRange.AutoFill(xlTargetRange, Excel.XlAutoFillType.xlFillSeries)

        Call ComObjectRelease(CType(xlSourceRange, Object))
        Call ComObjectRelease(CType(xlTargetRange, Object))
        Call ComObjectRelease(CType(xlDataTopCell, Object))
        Call ComObjectRelease(CType(xlTopCell, Object))
        Call ComObjectRelease(CType(xlSheet, Object))
        Call ComObjectRelease(CType(xlSheets, Object))
        Call ComObjectRelease(CType(xlBook, Object))
        Call ComObjectRelease(CType(xlBooks, Object))
        Call ComObjectRelease(CType(xlApp, Object))
    End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加