2017-10-02 3 views
0

私はサブ間で値を前後に渡す方法を学ぼうとしています。私は最終的にそれらの間で同じコード行を何度も何度も繰り返し使用するいくつかのマクロサブを作成しました。開始するには、列と行の数を調べたりカウントしたりできます。これは私が今まで持っているものですが、うまくいきません。VBA間のパス値

私はまた、列から行へと広げたいと思っています。

Public Sub main() 
Dim lCols As Integer 
Dim lRows As Integer 

    lCols = countCols(Sheet1) 

    Sheet1.Range("M2").Value = lCols 

End Sub 

Public Function countCols(sheetValue As Worksheet) As Variant 
     countCols = sheetValue.Cells(Rows.Count, 1).End(x1Up).Row 
    Exit Function 
End Function 

今、それは関数内でハングアップ...それはsheetValueに「シート1」を渡していないようです。

+3

次 'x1Up'は' xlUp'小文字の 'L'ではない '1'でなければなりません。 –

+0

この前にこの質問に回答しました。このリンクをご覧ください: https://stackoverflow.com/questions/17998773/set-a-variable-in-one-sub-and-use-in-another/17999208# 17999208 –

+0

Scottさんのコメントで問題が解決されない場合は、「ハングする」という意味の詳細について質問を更新してください。 ( 'xlUp'の代わりに' x1Up'を使用すると、通常、アプリケーション定義のエラーやオブジェクト定義のエラーでコードがクラッシュするか、正しくない値を返すだけです)。 – YowE3K

答えて

2

いくつかのポイント:

  1. それは長いとして、行と列変数を宣言する方が良いでしょう。 thisを参照してください。
  2. あなたがIntegerとして変数を宣言したlCols, lRows機能の型を返すも、あなたのケースでExit Functionを使用する必要はありませInteger
  3. あってはなりません。 Exit Functionは、関数を終了し、関数呼び出しの後のステートメントを実行するために使用されます。しかし、あなたのケースでは、関数自体がそこで終わります。したがって、出口は必要ありません。

てみ

Public Sub main() 
    Dim lCols As Long, lRows As Long 'declared as long 
    Dim ws As Worksheet 

    Set ws = ThisWorkbook.Sheets("Sheet2") 'change Sheet2 to your data sheet 

    lCols = countCols(ws) 
    lRows = countRows(ws) 

    ws.Range("M2").Value = lCols 
    ws.Range("N2").Value = lRows 

End Sub 

Public Function countCols(sheetValue As Worksheet) As Long 'should return long 
     countCols = sheetValue.Cells(1, sheetValue.Columns.Count).End(xlToLeft).Column 
End Function 

Public Function countRows(sheetValue As Worksheet) As Long 'should return long 
     countRows = sheetValue.Cells(sheetValue.Rows.Count, 1).End(xlUp).Row 
End Function 
+0

@c3nixon彼のコードは 'Option Explicit'とSheet1オブジェクトがないために壊れます。何かチャンスはありますか?コールズはヌルを得ることができますか? – BitAccesser

+1

@BitAccesser - データを持つ行または列がない場合、 'Cells(Rows.Count、1).End(xlUp).Row'および' Cells(1、Columns.Count).End(xlToLeft).Column'が返されます'1'。 – Mrig

+0

@BitAccesser関数が 'Long'を返す場合、それから' Null'を得ることはできません。 –