こんにちは良です。いつもお世話になっております。
環境はExcel2003でVB.NET2003WInXpです。
コンボボックスで○○年○○月〜○○年○○月
と指定してそこの値からエクセルシートに
セル範囲を指定してそこのセルに日にちと
曜日を出したいのですがうまく出力されません。
どんな関数を使ったら出せるのでしょうか?
>うまく出力されません。
セルの書式設定をしておけば、何もプログラムしなくても表示できますが?
こんにちは良です。
<特攻隊長まるるうさん
お返事ありがとうございます!
説明不足ですみません。
「コンボボックスで○○年○○月〜○○年○○月
と指定して」
というのはVB.NETのフォーム上にあるコンボボックスで
それを指定してボタンを押すと
エクセルの画面が起動して
そこで指定したセルにその月の日にちと曜日が
一気に出るようにしたいんですが
セルの書式設定でできますか?
どううまくいかないの?
曜日なら書式設定だけでできますけど
エクセルの操作なら過去ログに山のようにあるし
具体的にどういうコード書いてどんなエラーがでたとか書いたほうがいいと
思います
'表示開始日付算出
' 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の分だけ増える)
という風にしたいんですが実行したらエラーも
出ないで出力結果にも何も残りませんでした。
あ。 shtDayは
'Dim shtDay As Short
です。
>とりあえずコンボで2006年6月
>っていれたら2006年5月6日から
>2006年6月の5日までを
…こう…他人には意味不明な仕様を盛り込むのは…嫌がらせですか?w
とりあえず、コンボボックスを半分(Me.cmbYearStart, Me.cmbMonthStart)に
して、指定月1ヶ月分の出力ができるようになってから応用問題に取り組めば?
結局、dtViewEndDate は使ってないんだし、関係無いものは削除しておいて
ください。
> 出力結果にも何も残りませんでした。
どこにも何か出力するような処理は書かれていませんが?
…作り直し。
こんばんは良です。
>特攻隊長まるるうさん
・・・そうですね。
すみませんm(__)m
作り直します・・・
皆様混乱させてしまって申し訳ございませんm(__)m
なんか私のほうが混乱しているみたいです。
もう少し処理を考えます。
カルチャの情報とか、配列書込みとか、新しい情報が多かったので
サンプル作りました。
処理が不明な部分は適当に解釈してます。
エラー処理が面倒なので(日付として有効か?とか)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
こんばんは良です。
>特攻隊長まるるうさん
ありがとうございます!
これで求めていた答えが出そうです!
本当にいつもいつもすみませんm(__)m
本当にありがとうございました。
蛇足なんですがDateTimePicker1とDateTimePicker2が
Newされていなかったので
Dim DateTimePicker1 As New DateTimePicker
Dim DateTimePicker2 As New DateTimePicker
として
dtViewStartDate = New Date(設定したいもの(コンボボックスとか))
dtViewEndDate = New Date(設定したいもの(コンボボックスとか)))
にしたらうまくできました。
本当に本当にありがとうございましたm(__)m
そしていつもすみませんです・・・
>蛇足なんですがDateTimePicker1とDateTimePicker2が
>Newされていなかったので
DateTimePicker は、標準で用意されているコントロールなので、
デザイン画面で貼り付ければ自動で New されるコードが追加
されます。
> " Windows フォーム デザイナで生成されたコード "
の中の話になりますが。
> dtViewStartDate = New Date(設定したいもの(コンボボックスとか))
サンプルでは、コンボボックスの代わりに DateTimePicker を使ったと
いうことです。
あと、Button1_Click の中の
> Call ExcelWrite(xlRange, MakeData)
は
Call ExcelWrite(xlRange, objDatax)
でいいから。…2回も計算してました(汗)。修正してください。
おはようございます。良です
>特攻隊長まるるうさん
>Call ExcelWrite(xlRange, objDatax)
>でいいから。…2回も計算してました(汗)。修正してください。
わかりました。修正しておきます。
ついでに別解。
書式を設定してエクセルに全てお任せバージョン。
エクセルのセル参照式(=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
ツイート | ![]() |