C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■33077  Re[3]: 進行状況バー(何%完了)の表示
□投稿者/ 魔界の仮面弁士 -(2009/02/20(Fri) 10:05:27)
    2009/02/20(Fri) 10:41:03 編集(投稿者)

    No33072 (ka さん) に返信
    >>(1) 現在は、どのようにして取り込んでいますか?
    > →項目チェックを行った後、項目によっては文字列を分類しマスタ検索した
    >     のち複数のテーブルへ更新しています。 

    ごめんなさい、聞き方が悪かったですね。
    変換中の作業内容ではなく、変換手法を聞きたかったのです。

    Excel → SQL Server 2000 といっても、その変換方法は多岐に渡りますよね。
    複数行を一括処理する手法や、一行ずつ処理する手法。
    データ加工を VB 側で行う手法や、SQL Server 側に担当させる手法など。

    ・SQL Server のデータ変換サービス (DTS) を用いている。
    ・Excel 参照用のリンク サーバーを作り、それを OPENQUERY にて参照し、SQL Server 側で加工して取り込んでいる。
    ・OPENROWSET もしくは OPENDATASOURCE を用いて Excel を参照し、SQL Server 側で加工して取り込んでいる。
    ・System.Data.SqlClient.SqlBulkCopy クラスを利用して、作業テーブルに一括して取り込んでいる。
    ・OleDbDataAdapter 経由で得た Excel データを DataTable 上で加工し、それを SqlDataAdapter にて反映させている。
    ・Excel のオートメーション機能を利用してデータを読み取り、それを VB 側で加工後、1行ずつ SqlCommand で更新している。
    ・その他

    どのような方法を使うかによって、進捗表示のために使える手順も異なってくるかと思います。

    現在の方法が、進捗表示機能を備えている、あるいは容易に実装可能ならば、さほど問題は無いでしょう。

    しかし、もしも進捗表示に向かない手法が使われていたとして、しかも作業工程上、他の変換方法を
    選択できないような場合には、進捗表示そのものを諦めなければならないかも知れません。
    (その場合の選択肢としては、予想終了時間を経験則で見積もり、経過時間を表示することで代用するなど)

    あるいは、変換方法を変更することで、進捗表示が不要になるほど高速に処理できる事もありえます。
    その逆に進捗表示を付加したが故に、大幅な速度低下になってしまう可能性も無いとは言えません。
    (たとえばオートメーション法などは、柔軟性が高い反面、変換効率としては最低の部類にあたるでしょう)

    という事で、「現在はどのようにして変換しているのか」といった点を知るために、
    先の『現在は、どのようにして取り込んでいますか?』という質問に至った次第です。


    >>(2) 処理前に、データの総件数は事前に取得できますか?
    >    →Excelをオープンした時になら可能です。
    変換方法によって、「現在の処理行数」を得る方法は異なります。

    たとえば、SqlBulkCopy を使うと、一定行数を取りこむごとに SqlRowsCopied イベントが発生し、
    それを使って「現在の処理行数」を報告させる事ができます。
    # SqlBulkCopy による CSV 変換例。
    # http://www.vbstation.net/tips/sqlbulkcopy_zip.htm

    あるいは、先述のように、BackgroundWorker を使って通知する方法もあるかと思います。

    ただ、どの方法を使うにしても、全体の進捗率をパーセンテージで表示したいのであれば、
    現在の処理行数が、全体の何割に相当するのかを調べるために、事前にデータの総件数を
    得ておいた方が良いでしょうね。


    > →すみません。初心者なもので、上記イベントとか分かりません。
    流石に掲示板でゼロから教えるわけにもいかないので、まずは分かる範囲で調べてみてください。
    提示したキーワードで MSDN ライブラリや ネット上を探せば、少なからず情報は得られるかと思います。

    その上で、「〜という URL で情報を見つけたけれど、その中の〜という部分の意味がわからない」とか、
    「〜というサンプルを見つけて試したけれど、〜というエラーになってしまった」など、
    「〜という機能がある事がわかったが情報が足りないので、参考文献を教えて欲しい」など、
    【具体的】な質問を投稿してみれば、何らかの回答が得られるかと思います。
記事No.33045 のレス /過去ログ58より / 関連記事表示
削除チェック/

■43535  Re[1]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ 魔界の仮面弁士 -(2009/11/12(Thu) 11:12:07)
    No43519 (msnr さん) に返信
    > 思うのですがオブジェクトモデルを見ても分かりにくく困っています。
    オブジェクトモデル自体は、VBA と殆ど一緒なのですが、
     ・Optional 引数
     ・名前付き引数
     ・引数付きプロパティ
    などが、現行バージョンの C# では使えないので、
    言語制限上、VB.NET/VBA とは多少異なる構文になりがちですね。


    > ワークブックを開くとA列の1〜5行目まで各々の行数が入力され
    ブック上の、どのシートのA列でしょうか。

    今回の場合、Sheet1 のイベントを使っているのですから
    「アクティブなシート」ではなく、「Sheet1」を対象にするのですよね?
    だとしたら、Application.Cells ではなく、this.Cells を使うべきかと。

    > Excel.Worksheets1.Range("A1:A5").Clear
    VB.NET であればそのようにも指定できますが、C# では第2引数の省略が出来ないので、
     〜.Range["A1:A5", System.Type.Missing].Clear();
    とする事になります。もしくは、
     〜.Range["A1", "A5"].Clear();
    という書き方もできますね。
記事No.43519 のレス /過去ログ74より / 関連記事表示
削除チェック/

■91927  Re[11]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/10(Sat) 10:16:21)
    ありがとうございます。
    
    
            For r As Integer = 0 To n - 1 Step n_radix
    
                fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r_st + r)
    
            Next r
    
    としてみましたが、
    それでも、やはり正しい結果は得られないのですが、なぜでしょうか?
    
    
    配列はByValやByRefを指定しなくとも
    参照型(ByRef)で渡されることは知っていますが
    後から、コードを見たときに分かりやすくするために
    一応、付けています。
    
    ちなみに、普通は配列にはByValやByRefを付けないものなのでしょうか?
    
    ReturnはFunctionのためのもので、
    Exit Sub はSubのためのものだと思っていました。
    
    仰る通り、長い間VBAを使ってきましたので、
    その名残が残っています。
    
    
    
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91930  Re[12]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/10(Sat) 14:19:15)
    No91927 (えんえん さん) に返信
    > それでも、やはり正しい結果は得られないのですが、なぜでしょうか?

    「ar と ai」「tmpr と tmpi」は、再帰処理のたびに入れ替わりますよね。
    ざっと見た感じでは、入れ替えた際の添字管理に問題があるように見えます。


    話を単純化するため、元の処理を下記のように置き換えてみましょう。

     void Proc(int x[], int y[])
     {
      if (x[0] != 0) Proc(&y[1], x);
     }
     void main()
     {
      int ar1[4] = { 11, 22, 33, 0 };
      int ar2[4] = { 55, 66, 77, 0 };
      Proc(ar1, ar2);
     }

    この場合、ポインタは以下のように遷移しますよね。
    この動作をポインタ代わりの r_st% で管理しようとして、失敗しているように見えます。

     main から渡す実引数は
      ar1 が { 11, 22, 33, 0 }
      ar2 が { 55, 66, 77, 0 }
     → C++ の main から呼び出された Proc の仮引数
      x は { 11, 22, 33, 0 }
      y は { 55, 66, 77, 0 }
     →→→ 1 回目の再帰処理で呼ばれた Proc の仮引数
      x は { 66, 77, 0 }
      y は { 11, 22, 33, 0 }
     →→→→ 2 回目の再帰処理で呼ばれた Proc の仮引数
      x は { 22, 33, 0 }
      y は { 66, 77, 0 }
     →→→→→ 3 回目の再帰処理で呼ばれた Proc の仮引数
      x は { 77, 0 }
      y は { 22, 33, 0 }
     →→→→→→ 4 回目の再帰処理で呼ばれた Proc の仮引数
      x は { 33, 0 }
      y は { 77, 0 }
     →→→→→→→ 5 回目の再帰処理で呼ばれた Proc の仮引数
      x は { 0 }
      y は { 33, 0 }
     ←←←←←← 再帰が終わって呼び出し元(4 回目)に戻る
      x は { 33, 0 }
      y は { 77, 0 }
     ←←←←← 再帰が終わって呼び出し元(3 回目)に戻る
      x は { 77, 0 }
      y は { 22, 33, 0 }
     ←←←← 再帰が終わって呼び出し元(2 回目)に戻る
      x は { 22, 33, 0 }
      y は { 66, 77, 0 }
     ←←← 再帰が終わって呼び出し元(1 回目)に戻る
      x は { 66, 77, 0 }
      y は { 11, 22, 33, 0 }
     ←← 再帰が終わって最初の呼び出しに戻る
      x は { 11, 22, 33, 0 }
      y は { 55, 66, 77, 0 }
     ← C++ の main まで戻ってきて
      ar1 が { 11, 22, 33, 0 }
      ar2 が { 55, 66, 77, 0 }



    > 配列はByValやByRefを指定しなくとも
    > 参照型(ByRef)で渡されることは知っていますが

    いろいろごちゃ混ぜになっているような。

    ByVal / ByRef の省略の話と、配列であるかどうかは無関係ですし、
    ByVal / ByRef の話と 値型 / 参照型 の話も別物ですよ。


    > 後から、コードを見たときに分かりやすくするために
    > 一応、付けています。

    『値渡し』を望むなら、ByVal は省略しようと明示しようと、どちらでも構わないと思います。
    自分の場合、新規開発ならば省略表記にした方がスッキリするので記述しませんが、
    VBA からの移行であれば、明示的に記述して移植時の意図を明確にするようにしています。

    一方、『参照渡し』を望むなら、VBA とは違って、ByRef を明示する必要があります。
    しかし ByRef を付けた理由が「配列だから」というのなら、使い方が間違っています。


    > ちなみに、普通は配列にはByValやByRefを付けないものなのでしょうか?
    配列かどうかは一切関係ありません。

    使い分けの方針としては、「出力引数」として実装する場合に限って ByRef を使い、
    それ以外の場合は全て、値渡しとして処理させるのが普通です。

    ただ、出力引数を使うことがそもそも稀であるため、.NET Framework のライブラリで見ても、
    ByRef が利用されているものは殆どありません。使うとしても TryParse メソッドぐらいのものでしょう。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91933  Re[14]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/10(Sat) 16:23:56)
    2019/08/10(Sat) 16:26:50 編集(投稿者)

    No91932 (774RR さん) に返信
    > FFT なんぞテキトーに探せばいくらでもライブラリが転がっているような気のせいがする。

    この辺にありそうな気がします。確認はしていませんけど。
    https://www.nuget.org/packages?q=fft

    VB.NET に移植済みの実装が欲しいという話なら、こんなのもあります。
    http://numeric.world.coocan.jp/computer/vb/mathpack.htm

    Excel VBA でも良ければこんなのもありました。
    関数化はされていないものの、再帰処理を用いないフラットな実装。
    http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html


    真面目に再実装する気があるなら、複素数構造体を併用すると良いかもしれません。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.complex.frompolarcoordinates

    複素数構造体を用いた実装例は下記にありました。
    F# なので参考にはしにくいかもしれませんが。
    http://www.fssnip.net/dC/title/fast-Fourier-transforms-FFT-



    No91927 (えんえん さん) に返信
    > For r As Integer = 0 To n - 1 Step n_radix
    >   fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r_st + r)
    > Next r
    > としてみましたが、
    > それでも、やはり正しい結果は得られないのですが、なぜでしょうか?

    オリジナル版にある
     fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
    ってのは
     fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], &ar[0], &ai[0]);
    でもあるわけですし、再帰で tmpX と aX が入れ替わる点が肝かと思います。

    すなわち、index の offset は r_st 一つでは足りなくて、
    a 系と tmp 系の両方に対して用意すべきかと思います。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -