none
「名前空間のステートメントが無効です」というエラー RRS feed

  • 質問

  • 全くの初心者です。
    以下のコードをコンパイルしたいのですが、Sub Main の箇所に
    「名前空間のステートメントが無効です」というエラーがでて、どうしても修正できません。
    対処法がわかれば、ぜひとも教えていただきたく。
    コンパイルソフトはVisual Basic 2008を使用しています。
    宜しくお願いいたします。

    Option Explicit
    Sub Main
      Dim srfApp, wks As Object
      Dim inFile, xyzName, xyzDir, xyzFile, tmpFile, opts, row, y As String
      Dim x() As String
      Dim center(1) As Double
      Dim xMin, xMax, yMin, yMax, collar(9) As Double
      Dim i,j,xcnt As Integer

      ' Start Surfer
      Set srfApp = CreateObject("Surfer.Application")
      'srfApp.Visible = True

      ' Get the file to convert
      inFile = GetFilePath("","xls","","Open Excel worksheet containing array",0)
      ' Need to handle cancel from file dialog
      If inFile = "" Then Exit Sub

      ' Generate name for the temp .dat file
      tmpFile = Left(inFile,Len(inFile)-4) + "_temp.dat"

      ' Get the output file name.
      ' Default to input name + "_xyz"
      i = InStrRev(inFile,"\")
      j = InStrRev(inFile,".")
      xyzName = Mid(inFile,i+1,j-i-1) + "_xyz.dat"
      xyzDir = Left(inFile,i)
      xyzFile = GetFilePath(xyzName,"dat",xyzDir,"Save XYZ As",3)
      ' Need to handle cancel from file dialog
      If xyzFile = "" Then Exit Sub

      ' Open the input data file
      Set wks = srfApp.Documents.Open(inFile)

      ' Save it to a temporary .dat file and quit Surfer
      wks.SaveAs(tmpFile,,srfSaveFormatCsv)
      srfApp.Quit

      ' Open the temp .dat
      Open tmpFile For Input As #1

      ' Open the output xyz.dat file
      Open xyzFile For Output As #2

      ' Read the first row of X values and store in array
      Line Input #1, row
      xcnt = UBound(Split(row,","))
      ReDim x(xcnt)
      For i = 1 To xcnt
        x(i) = Split(row,",")(i)
      Next i

      ' Read through the rest of the temp.dat file and
      ' write x,y,z values to the output file.
      Do Until EOF(1)
        Line Input #1, row
        y = Split(row,",")(0)
        For i = 1 To xcnt
          Print #2,x(i);",";y;",";Split(row,",")(i)
        Next i
      Loop

      ' Close the temp .dat and delete it.
      ' Close the output file
      Close #1
      Kill tmpFile
      Close #2

    End Sub

    2013年5月22日 2:19

回答

  • Visual Basic 2008はオブジェクト指向の言語ですから、Sub MainはClassの中に書く必要があります。
    例えば以下のようになります。

    Public Class 何とかクラス名

        Sub Main

            ・
            ・
            ・
        End Sub

    End Class

    (追記)
    kentahogaさんが書かれていたので気が付いたのですが、VBなのでModuleもあり得ますね。以下の対処方法のページである、

    名前空間のステートメントが無効です。
    http://msdn.microsoft.com/ja-jp/library/5ycdx874(v=vs.90).aspx

    を見ると、
    「このエラーを解決するには
    モジュール、クラス、インターフェイス、構造体、列挙体、またはデリゲートの定義内にステートメントを移動します

    と書かれています。

    ちなみに、bekkan6FさんはSub Mainを名前空間(Namespace)の位置に書かれているため、コンパイラはSub Mainを名前空間として解釈しようとしましたが、できなかったので今回のエラーを発しています。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年5月22日 2:37
    モデレータ
  • 新規でコンソールプロジェクトを作成すると、以下のようになるかと思います。

    このModuleで囲まれたMainの中に、コードを記入すれば良いかと思います。

    Module Module1
    
        Sub Main()
            'ここに内容を記入していく
        End Sub
    
    End Module

    初心者の方であれば、内容が難しいかもしれませんが、以下のエラーですね。要は、VB2008ではSub Main()のさらに外側に、記述が必要ということです。

    http://msdn.microsoft.com/ja-jp/library/5ycdx874(v=vs.80).aspx

    • 編集済み kentahoga 2013年5月22日 2:46 説明を追記
    • 回答の候補に設定 星 睦美 2013年5月23日 5:45
    • 回答としてマーク 星 睦美 2013年5月30日 1:57
    2013年5月22日 2:41

すべての返信

  • Visual Basic 2008はオブジェクト指向の言語ですから、Sub MainはClassの中に書く必要があります。
    例えば以下のようになります。

    Public Class 何とかクラス名

        Sub Main

            ・
            ・
            ・
        End Sub

    End Class

    (追記)
    kentahogaさんが書かれていたので気が付いたのですが、VBなのでModuleもあり得ますね。以下の対処方法のページである、

    名前空間のステートメントが無効です。
    http://msdn.microsoft.com/ja-jp/library/5ycdx874(v=vs.90).aspx

    を見ると、
    「このエラーを解決するには
    モジュール、クラス、インターフェイス、構造体、列挙体、またはデリゲートの定義内にステートメントを移動します

    と書かれています。

    ちなみに、bekkan6FさんはSub Mainを名前空間(Namespace)の位置に書かれているため、コンパイラはSub Mainを名前空間として解釈しようとしましたが、できなかったので今回のエラーを発しています。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年5月22日 2:37
    モデレータ
  • 新規でコンソールプロジェクトを作成すると、以下のようになるかと思います。

    このModuleで囲まれたMainの中に、コードを記入すれば良いかと思います。

    Module Module1
    
        Sub Main()
            'ここに内容を記入していく
        End Sub
    
    End Module

    初心者の方であれば、内容が難しいかもしれませんが、以下のエラーですね。要は、VB2008ではSub Main()のさらに外側に、記述が必要ということです。

    http://msdn.microsoft.com/ja-jp/library/5ycdx874(v=vs.80).aspx

    • 編集済み kentahoga 2013年5月22日 2:46 説明を追記
    • 回答の候補に設定 星 睦美 2013年5月23日 5:45
    • 回答としてマーク 星 睦美 2013年5月30日 1:57
    2013年5月22日 2:41
  • trapemiya 様
    kentahoga様

    回答いただきありがとうございます。
    Module Module1
       
    Sub Main()
        ~
        End Sub
    End Module
    のようにしたのですが、
    GetFilePath、serfFormatCSV,Open,Closeの各関数に
    「宣言されていません」他のエラーがたくさん出てきます。
    各宣言文を与えると、sub Mainに「ステートメントをソリッド本体の内部に表示することはできません」
    というようなエラーが出てきます。 なにか良い対処法はありませんでしょうか。

    2013年5月22日 3:02
  • ソリッドではなくてメソッドの誤りですよね。
    それは置いておいて、GetFilePath等の関数本体を記述されていますか? それらの関数をコンパイラが見つけることができない状況です。 全くの初心者であることはわかりましたが、どれぐらい学習されていますか? 少なくとも基本的な知識が足りていないように思います。掲載されているコードもおそらくどこかのコードを持ってきただけで、そのコードを理解されていないのではないでしょうか? とりあえず動作させてみるというのも間違ったアプローチではないと思いますが、今の知識だとこれから大変そうです。書籍などでもう少しまとまった学習をされることをお勧めします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年5月22日 3:38
    モデレータ
  • trapemiya様

    返信いただきありがとうございます。
    お恥ずかしい限りですが、どうしてもコンパイルを成功させたく。
    コンパイラに記述が必要とおっしゃられてましたが、それらの関数をコンパイラに組み込むことが必要なのでしょうか。
    エラーの処理ばかりに目が向いていましたが、その方向で解決策を見つけたいと思います。

    2013年5月22日 4:00
  • trapemiyaさんに追加になりますが、

    bekkan6Fさんが記述しているコードは、VB.NETのコードではなく、VB6(またはそれ以前)のコードかと思います。おそらくエラーが20個とかでて、全く理解できない状態でしょうが、今の知識だと難しいと思います。

    そのコードを実行するためには、エラー箇所をVB.NETの形式に置き換える必要があります。もしくは、VB6の環境で動かす必要があります。

    例えば、Line Input 部分に関しては、以下のページが参考になるかと思います。

    http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet07/vb6tonet07_01.html

    上のページの目次はここです。

    http://www.atmarkit.co.jp/fdotnet/vb6tonet/index/index.html

    • 編集済み kentahoga 2013年5月22日 4:15
    2013年5月22日 4:09
  • コンパイラに記述が必要とおっしゃられてましたが、それらの関数をコンパイラに組み込むことが必要なのでしょうか。

    いえいえ、そういうことではありません。Sub Mainと書かれたように、GetFilePath、serfFormatCSV,Open,Closeの各関数も記述する必要があるということです。ただ、.NET Frameworkに最初から用意されている関数や、もしくは他の形(dllなど)で提供されている関数であれば、それを利用できるようにImportsで名前空間の指定をしたり、そのdll等を参照設定することになります。
    と、書きましたが、後半の部分は理解できませんよね・・・
    とりあえず、、GetFilePath、serfFormatCSV,Open,Closeのコードがあれば、それをSub Mainと同様に記述してみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年5月22日 4:13
    モデレータ
  • kentahoga様

    返信ありがとうございます。
    参照してみます。何とかしたく。。。がんばります。
    本当は、そのコードを利用して、xyz形式からマトリックス形式に逆の変換プログラムを作りたいのです。

    挑戦してみます。

    2013年5月22日 4:17
  • trapemiya様

    返信ありがとうございます。
    とりあえずGetFilePath、serfFormatCSV,Open,Closeのコードを探してみます。

    2013年5月22日 4:34
  • このコードですが、ネットから取ってきましたか?であれば、その元を教えてください。

    また、私が話している内容とは別な問題として、trapemiyaさんが話されている問題があります。おそらく両方を解決する必要があると思われます。

    なかなか厳しいとは思いますが、学習に挑戦して、がんばってみてください!

    • 編集済み kentahoga 2013年5月22日 5:06 一部削除
    2013年5月22日 4:51
  • kentahoga様

    ソースの元は、http://www.goldensoftware.com/public/scripts/surfer11/Matrix2XYZ.basです。
    宜しくお願いいたします。

    2013年5月22日 5:18
  • リンク先は、VBAのコードかと思われます(拡張子が.basなことや、コメントから推測して)。VBAとは平たく言うと、エクセルなどで使用するプログラミング言語です。

    また、リンク先はコード全体の一部をエクスポートしたものかと思われます(trapemiyaさんのお話の内容)。おそらく、このコードを修正するのは、現時点では難しいと思われます。

    もし、行列変換プログラムを作成されたいのであれば、何かの言語を学習して、自分で作成することをお勧めします。または、他の良いコードを探してくること、出来上がっているソフトを探してくることをお勧めします。

    2013年5月22日 6:34
  • kentahoga様

    返信ありがとうございます。
    VBAだったとは。。
    他のソースをあたってみようと思います。
    アドバイス感謝いたします。

    2013年5月22日 6:54
  • 本当は、そのコードを利用して、xyz形式からマトリックス形式に逆の変換プログラムを作りたいのです。

    このフォーラムで話す内容ではないかと思いますが、こういったことがしたいのであれば、技術計算言語のMATLABを使用すると良いかもしれません。(私は学生時代に使用していました)

    よろしければ、ご参考にされて下さい。

    http://www.mathworks.co.jp/jp/help/comm/ref/vec2mat.html

    http://www.mathworks.co.jp/products/matlab/

    2013年5月22日 6:56
  • kentahoga様

    MATLABの紹介ありがとうございます。実は改良しようとしているVBAはsuferというマッピングソフトのスクリプト(エクセルのVBAのようなもの?)で使用できます。調べさせてしまい、すみませんでした。
    VBAは以前から少しだけ使用してるのですが、処理スピードで不満があり、できれば以前からVBかC++でと思っていましたが、今回、このVBAを改良することも含めて、もう少し検討したいと思います。

    2013年5月22日 8:29
  • bekkan6F さん、こんにちは
    フォーラム オペレーターの星 睦美です。

    私のほうでtrapemiya さんとkentahoga さんのスレッドを[回答の候補に設定] させていただきました。
    質問のエラーに関するトラブルシューティングに役立ったのではないかと思います。
    今回はいろいろ参考になる情報がありそうですので、よろしければ投稿者から[回答としてマーク]いただければ幸いです。

    ---

    回答の内容がコミュニティで役立つ内容だと思いますので、私から[回答としてマーク] させていただきました。

    それでは今後ともMSDN フォーラムをよろしくお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美


    • 編集済み 星 睦美 2013年5月30日 1:59 回答としてマーク
    2013年5月23日 5:52