Attribute VB_Name = "WGS_GK"
Option Explicit

Public Sub WGS_to_GK(Longitude As Double, B As Double, _
                     x As Double, y As Double)
  'Longitude and B -  geo-coords (in degrees), B -  широта (latitude)
  ' x, y - coordinates of Gauss-Kruger (meters)
  
  N = Int((6 + Longitude) / 6) ' Number of a GK-zone. 'Int' is integer part.
  L = (Longitude - (3 + 6 * (N - 1))) / 57.29577951
  
  sinB = Sin(B)
  x = 6367558.4968 * B - Sin(2 * B) * (16002.89 + 66.9607 * sinB ^ 2 + _
    0.3515 * sinB ^ 4 - L ^ 2 * (1594561.25 + 5336.535 * sinB ^ 2 + _
    26.79 * sinB ^ 4 + 0.149 * sinB ^ 6 + L ^ 2 * (672483.4 - _
    811219.9 * sinB ^ 2 + 5420 * sinB ^ 4 - 10.6 * sinB ^ 6 + _
    L ^ 2 * (278194 - 830174 * sinB ^ 2 + 572434 * sinB ^ 4 - _
    16010 * sinB ^ 6 + L ^ 2 * (109500 - 574700 * sinB ^ 2 + _
    863700 * sinB ^ 4 - 398600 * sinB ^ 6)))))
  y = (5 + 10 * N) * 100000 + L * Cos(B) * (6378245 + 21346.1415 * sinB ^ 2 + _
    107.159 * sinB ^ 4 + 0.5977 * sinB ^ 6 + L ^ 2 * (1070204.16 - _
    2136826.66 * sinB ^ 2 + 17.98 * sinB ^ 4 - 11.99 * sinB ^ 6 + _
    L ^ 2 * (270806 - 1523417 * sinB ^ 2 + 1327645 * sinB ^ 4 - 21701 * sinB ^ 6 + _
    L ^ 2 * (79690 - 866190 * sinB ^ 2 + 1730360 * sinB ^ 4 - 945460 * sinB ^ 6))))
    
    
End Sub

Public Sub test()
  Dim x As Double, y As Double
  Dim dolgota As Double, shirota As Double
  dolgota = [B30]
  shirota = [C30]
  Call WGS_to_GK(dolgota, shirota, x, y)
  Range("D30") = x
  Range("E30") = y
End Sub

